少しのバーストと少しの再帰で何かをしたとしたらどうなるでしょうか:
主な機能
何が起こるかは、与えられた間隔 (つまり 500) で渡され、与えられた反復回数でループを終了するindex
と、同じバースト番号で自分自身を呼び戻します。features 配列の最後が完了すると、関数は終了します。burst
for
burst
var transferFeatures = function (index, burst) {
for (var z = 0; z <= burst; z++) {
if (index === features.length) {
return;
}
var feature = features[index];
if (feature.onScreen) {
dataArray.push(feature.attributes);
}
index++;
}
if (index !== features.length) {
transferFeatures(index, burst);
}
};
テスト
負荷をシミュレートするために、さまざまなキーと値のペア (最も重要なのはattributes
内部オブジェクト)を使用してオブジェクトの配列を作成しました。
//To simulate a random boolean
var randomBoolean = function () {
return Math.random() <= 0.5;
};
//A random integer
var getRand = function () {
return (Math.floor(Math.random() * 10).toString());
};
// Create a bunch of dummy objects
var randomFeatures = function (arr, i) {
for (var p = 0; p < i; p++) {
arr.push({
onScreen: randomBoolean(),
attributes: {
width: getRand(),
height: getRand(),
someAtt: "I'm just an attribute",
coolKidsRideBikes: true,
foo: "bar",
bar: "baz"
}
});
}
};
確かに、これはonScreen()
使用するテストと同じではありませんが、どちらにしてもboolean
値に評価されます。この概念をコードに適用すると、驚くべき結果が得られると思います。
私がリンクしたフィドルのすべては、一番上にある次のように呼び出されます。
randomFeatures(features, 5000);
console.log(features.length);
transferFeatures(0,500);
console.log(dataArray.length);
負荷テスト
ofを使用し5000000
て (500 万個の) ランダムなオブジェクトがプッシュされるようにシミュレートfeatures
したところ、スクリプトは約 3.29 秒で完了しました。
burst
1000
