私は、挿入/追加と参照の点でSetの実装がObject(Google Chromeで実行)より高速であるという確信を確かめることにしました。私の結果はやや混乱していた。検索時間をObjectよりも遅く設定しますか?
x = {};
y = new Set();
console.time('Insert into Object');
for (var i = 0; i < 1000000; i++) {
x[i] = 0;
}
console.timeEnd('Insert into Object');
console.time('Insert into Set');
for (i = 0; i < 1000000; i++) {
y.add(i);
}
console.timeEnd('Insert into Set');
var t = 0;
console.time('Retrieve from Object');
for (i = 0; i < 1000000; i++) {
t = x[i];
}
console.timeEnd('Retrieve from Object');
console.time('Retrieve from Set');
for (i = 0; i < 1000000; i++) {
t = y.has(i);
}
console.timeEnd('Retrieve from Set');
VM19742:9 Insert into Object: 1341.777ms
VM19742:15 Insert into Set: 1473.025ms
VM19742:23 Retrieve from Object: 1469.717ms
VM19742:29 Retrieve from Set: 1666.430ms
ご覧のとおり、このセットはオブジェクトよりも少し悪い結果でした。これは、基本的な実装が値を格納する余分のオーバーヘッドなしでオブジェクトと同じになると思ったので私を混乱させます。これはなぜ誰にも特別な洞察力がありますか?
ベンチマークの一部は削除することができます( 't = x [i]'のように、副作用がなく、 't'は使用されません)。完全なベンチマークをまとめ、最適化を妨げ、適切なハーネスでテストして、正確なサンプルと結果を得る必要があります。 – ssube
Chromeでコードを実行すると、オブジェクトはセットよりほぼ4倍高速です。どちらも配列よりも低速です(配列検索はオブジェクトよりも5倍も高速で、セットよりも8倍も高速です)。 –
疑惑:それはあなたがセットを拡大できるようにしているからです。 –