オブジェクトの配列として保存されたデータポイントのグラフがあるブラウザベースの視覚化アプリがあります。
data = [
{x: 0.4612451, y: 1.0511} ,
... etc
]
このグラフはd3で視覚化され、キャンバスに描画されています(興味深い議論についてはその質問を参照してください)。これはインタラクティブであり、スケールは大きく変化する可能性があります。つまり、データを再描画する必要があり、特にズームをアニメーション化する場合は、配列を頻繁に繰り返す必要があります。
頭の後ろから、他の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スケールオブジェクトであり、スケーリングされた位置を計算する関数です。上記のコードは1秒あたり最大60フレームを実行する必要があり、Firefoxのボールのように遅れる可能性があることを前述しました。私が見る限り、唯一の違いは配列の逆参照とオブジェクトへのアクセスです。どちらがより速く実行され、違いは重要ですか?