(MVC) 这是一种按日期显示图表数据的有效方式吗?
(MVC) Is this an efficient way of displaying chart data by date?
我只是想知道是否有人可以告诉我我是否在正确的轨道上。
我有一个数据库,其中包含由设备跟踪并按日期时间排序的温度值。我的目标是通过 ChartJS 创建报告图表(例如折线图)。现在问题是这个 table 包含数千行,我以前从未处理过这么多数据。
我正在考虑提示输入日期范围并使用日期查询 similar here。然后我会 return 它作为 JsonResult 并让 ChartJS 使用它。这够好了吗?
以下是我 运行(也包含代码)在 IE11 上使用 1 个图表和 1 个数据集进行的一些简单测试的结果。您必须 运行 通过 调整每个可用的图表选项 来针对您正在使用的图表类型进行自己的测试(开始前请先阅读 :-)) .
返回数据的子集肯定会产生积极影响,但关于这是否明显以补偿妥协的问题是非常主观的,需要实际测量(如果合理)才能弄清楚。
当您考虑端到端性能时,除了在类似环境的生产环境中进行检测、车削和更多检测外别无选择,当然,微优化是万恶之源(以及许多错过的咖啡休息时间)。要考虑的其他因素的简短(但绝不完整)列表是序列化/反序列化性能、网络时间、服务器配置(压缩等)等。
下面的测试是针对桌面客户端的,也只是为了时间。如果移动设备是目标环境,您肯定希望 运行 对环境进行一些测试以查看内存/CPU 使用情况。
愚蠢的简单测试
var POINTS = 5000;
var ANIMATION = false;
var BEZIERCURVE = false;
var SCALEOVERRIDE = false;
var ITERATIONS = 10;
// date generation
var data = [];
var labels = [];
for (var i = 0; i < POINTS; i++) {
labels.push("A")
data.push(Math.random() * 100)
}
var chartData = {
labels: labels,
datasets: [
{
data: data
}
]
};
// our charting function
function drawChart() {
var chart;
var startTime = (new Date()).getTime();
chart = new Chart(document.getElementById("myChart").getContext("2d")).Line(chartData, {
animation: ANIMATION,
scaleOverride: SCALEOVERRIDE,
scaleSteps: 10,
scaleStepWidth: 10,
scaleStartValue: 0,
bezierCurve: BEZIERCURVE,
onAnimationComplete: function () {
output.push((new Date()).getTime() - startTime);
if (chart !== undefined)
chart.destroy();
j++;
if (j < ITERATIONS)
setTimeout(drawChart, 0);
else
console.log(output);
}
});
}
var j = 0;
var output = [];
drawChart();
结果
与少许盐、酸橙和龙舌兰酒一起服用。时间以毫秒为单位,基于 10 次迭代。
----------------------------------------------------------------------------------------
| Type | Points | Animation | Bezier | Scale Override | Mean | Median |
----------------------------------------------------------------------------------------
| Bar | 10 | N | - | N | 2.7 | 3 |
| Bar | 100 | N | - | N | 14 | 13.5 |
| Bar | 1000 | N | - | N | 128.5 | 127.5 |
| Bar | 5000 | N | - | N | 637.4 | 626.5 |
| Bar | 10 | Y | - | N | 997.2 | 997 |
| Bar | 100 | Y | - | N | 1003.5 | 1006.5 |
| Bar | 1000 | Y | - | N | 3417.1 | 3418.5 |
| Bar | 5000 | Y | - | N | 17086.6 | 17085 |
| Bar | 10 | N | - | Y | 3.2 | 3 |
| Bar | 100 | N | - | Y | 14.5 | 14.5 |
| Bar | 1000 | N | - | Y | 127.2 | 125.5 |
| Bar | 5000 | N | - | Y | 638 | 632.5 |
| Bar | 10 | Y | - | Y | 996.6 | 997 |
| Bar | 100 | Y | - | Y | 999.4 | 999 |
| Bar | 1000 | Y | - | Y | 3441.9 | 3433.5 |
| Bar | 5000 | Y | - | Y | 16985.6 | 16959.5 |
| Line | 10 | N | Y | Y | 3.6 | 4 |
| Line | 100 | N | Y | Y | 16.4 | 16 |
| Line | 1000 | N | Y | Y | 146.7 | 145.5 |
| Line | 5000 | N | Y | Y | 821.5 | 820.5 |
| Line | 10 | N | N | Y | 2.9 | 3 |
| Line | 100 | N | N | Y | 14.3 | 14 |
| Line | 1000 | N | N | Y | 131 | 127 |
| Line | 5000 | N | N | Y | 643.9 | 635.5 |
| Line | 10 | N | N | N | 3.1 | 3 |
| Line | 100 | N | N | N | 15.6 | 15 |
| Line | 1000 | N | N | N | 131.9 | 133.5 |
| Line | 5000 | N | N | N | 666 | 660 |
正如预期的那样,比例覆盖有影响(但只有一点点),关闭贝塞尔曲线有明显的影响,使用条形图与折线图之间没有太大区别(至少对于我的配置 运行).随着点数的增加,动画会产生明显的影响(但我认为更简单的缓动函数会更快)
我只是想知道是否有人可以告诉我我是否在正确的轨道上。
我有一个数据库,其中包含由设备跟踪并按日期时间排序的温度值。我的目标是通过 ChartJS 创建报告图表(例如折线图)。现在问题是这个 table 包含数千行,我以前从未处理过这么多数据。
我正在考虑提示输入日期范围并使用日期查询 similar here。然后我会 return 它作为 JsonResult 并让 ChartJS 使用它。这够好了吗?
以下是我 运行(也包含代码)在 IE11 上使用 1 个图表和 1 个数据集进行的一些简单测试的结果。您必须 运行 通过 调整每个可用的图表选项 来针对您正在使用的图表类型进行自己的测试(开始前请先阅读 :-)) .
返回数据的子集肯定会产生积极影响,但关于这是否明显以补偿妥协的问题是非常主观的,需要实际测量(如果合理)才能弄清楚。
当您考虑端到端性能时,除了在类似环境的生产环境中进行检测、车削和更多检测外别无选择,当然,微优化是万恶之源(以及许多错过的咖啡休息时间)。要考虑的其他因素的简短(但绝不完整)列表是序列化/反序列化性能、网络时间、服务器配置(压缩等)等。
下面的测试是针对桌面客户端的,也只是为了时间。如果移动设备是目标环境,您肯定希望 运行 对环境进行一些测试以查看内存/CPU 使用情况。
愚蠢的简单测试
var POINTS = 5000;
var ANIMATION = false;
var BEZIERCURVE = false;
var SCALEOVERRIDE = false;
var ITERATIONS = 10;
// date generation
var data = [];
var labels = [];
for (var i = 0; i < POINTS; i++) {
labels.push("A")
data.push(Math.random() * 100)
}
var chartData = {
labels: labels,
datasets: [
{
data: data
}
]
};
// our charting function
function drawChart() {
var chart;
var startTime = (new Date()).getTime();
chart = new Chart(document.getElementById("myChart").getContext("2d")).Line(chartData, {
animation: ANIMATION,
scaleOverride: SCALEOVERRIDE,
scaleSteps: 10,
scaleStepWidth: 10,
scaleStartValue: 0,
bezierCurve: BEZIERCURVE,
onAnimationComplete: function () {
output.push((new Date()).getTime() - startTime);
if (chart !== undefined)
chart.destroy();
j++;
if (j < ITERATIONS)
setTimeout(drawChart, 0);
else
console.log(output);
}
});
}
var j = 0;
var output = [];
drawChart();
结果
与少许盐、酸橙和龙舌兰酒一起服用。时间以毫秒为单位,基于 10 次迭代。
----------------------------------------------------------------------------------------
| Type | Points | Animation | Bezier | Scale Override | Mean | Median |
----------------------------------------------------------------------------------------
| Bar | 10 | N | - | N | 2.7 | 3 |
| Bar | 100 | N | - | N | 14 | 13.5 |
| Bar | 1000 | N | - | N | 128.5 | 127.5 |
| Bar | 5000 | N | - | N | 637.4 | 626.5 |
| Bar | 10 | Y | - | N | 997.2 | 997 |
| Bar | 100 | Y | - | N | 1003.5 | 1006.5 |
| Bar | 1000 | Y | - | N | 3417.1 | 3418.5 |
| Bar | 5000 | Y | - | N | 17086.6 | 17085 |
| Bar | 10 | N | - | Y | 3.2 | 3 |
| Bar | 100 | N | - | Y | 14.5 | 14.5 |
| Bar | 1000 | N | - | Y | 127.2 | 125.5 |
| Bar | 5000 | N | - | Y | 638 | 632.5 |
| Bar | 10 | Y | - | Y | 996.6 | 997 |
| Bar | 100 | Y | - | Y | 999.4 | 999 |
| Bar | 1000 | Y | - | Y | 3441.9 | 3433.5 |
| Bar | 5000 | Y | - | Y | 16985.6 | 16959.5 |
| Line | 10 | N | Y | Y | 3.6 | 4 |
| Line | 100 | N | Y | Y | 16.4 | 16 |
| Line | 1000 | N | Y | Y | 146.7 | 145.5 |
| Line | 5000 | N | Y | Y | 821.5 | 820.5 |
| Line | 10 | N | N | Y | 2.9 | 3 |
| Line | 100 | N | N | Y | 14.3 | 14 |
| Line | 1000 | N | N | Y | 131 | 127 |
| Line | 5000 | N | N | Y | 643.9 | 635.5 |
| Line | 10 | N | N | N | 3.1 | 3 |
| Line | 100 | N | N | N | 15.6 | 15 |
| Line | 1000 | N | N | N | 131.9 | 133.5 |
| Line | 5000 | N | N | N | 666 | 660 |
正如预期的那样,比例覆盖有影响(但只有一点点),关闭贝塞尔曲线有明显的影响,使用条形图与折线图之间没有太大区别(至少对于我的配置 运行).随着点数的增加,动画会产生明显的影响(但我认为更简单的缓动函数会更快)