存储在大的阵列的数据时,我有一个基于浏览器的可视化应用程序,其中有数据点的图表,存储作为对象的数组:性能关注的Javascript
data = [
{x: 0.4612451, y: 1.0511} ,
... etc
]
此图是visualized with d3 and drawn on a canvas(看到这个问题进行有趣的讨论)。它是交互式的,尺度可以改变很多,这意味着数据必须重新绘制,并且需要频繁迭代数组,特别是在动画缩放时。
从我的脑海和阅读其他Javascript帖子,我有一个模糊的想法,优化JavaScript中的解除引用可以导致性能大大提高。 Firefox是我的应用运行速度非常慢的唯一浏览器(与IE9,Chrome和Safari相比),并且需要改进。因此,我想站稳,权威的答案如下:
慢多少是这样的:
// data is an array of 2000 objects with {x, y} attributes
var n = data.length;
for (var i=0; i < n; i++) {
var d = data[i];
// Draw a circle at scaled values on canvas
var cx = xs(d.x);
var cy = ys(d.y);
canvas.moveTo(cx, cy);
canvas.arc(cx, cy, 2.5, 0, twopi);
}
相比,这样的:
// data_x and data_y are length 2000 arrays preprocessed once from data
var n = data_x.length;
for (var i=0; i < n; i++) {
// Draw a circle at scaled values on canvas
var cx = xs(data_x[i]);
var cy = ys(data_y[i]);
canvas.moveTo(cx, cy);
canvas.arc(cx, cy, 2.5, 0, twopi);
}
xs
和ys
是D3规模对象,它们是计算缩放位置的函数。我在上面提到,上面的代码可能需要运行到60帧每秒和可以滞后像火球上的球。据我所见,唯一的区别是数组解引用vs对象访问。哪一个运行速度更快,差异显着?
您应该在[jsperf](http://jsperf.com/)上对其进行测试,尽可能多地使用浏览器。在另一个上最快的可能不是最快的(例如,递减循环比在大多数浏览器中增加循环要快一些,除了Opera,它们相当慢),所以你可能需要妥协。 – RobG 2013-03-27 00:01:19
'd','cx','cy'的一些'var'声明可能?在“*哪一个跑得快*”:你只能[测试,测试,测试](http://jsperf.com/) – Bergi 2013-03-27 00:01:48
对不起,从coffeescript翻译错误。我的世界没有变数。修正并感谢。 – 2013-03-27 00:02:29