es6で配列の要素の有無を判定するなら、Setのほうが速そう
es6で配列の要素の有無を判定するなら、Setのほうが速そう:
あらかじめ複数個の要素を格納しておいて、とある要素が含まれるか否かを調べたい場合、これまでは配列(
es6(ECMAScript 2015) からは、そういった目的によりマッチした
ArrayとSetで、要素の有無を調べる時の速度(パフォーマンス)の差が気になったので、サクっと調べてみました。
Array - JavaScript | MDN
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array
Set - JavaScript | MDN
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Set
それぞれの条件で、最後の要素の検索にかかった時間(カッコ内は最初の要素)
ほとんどの項目で、Setでの検索が優っていることが確認できます!
もちろん
しょしんしゃなので、まちがっているところがあったら、やさしくおしえてください。
おわり
あらかじめ複数個の要素を格納しておいて、とある要素が含まれるか否かを調べたい場合、これまでは配列(
Array )を使っていました。es6(ECMAScript 2015) からは、そういった目的によりマッチした
Set というオブジェクトが標準ビルトインされているようです!ArrayとSetで、要素の有無を調べる時の速度(パフォーマンス)の差が気になったので、サクっと調べてみました。
Array - JavaScript | MDN
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array
Set - JavaScript | MDN
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Set
調べ方
- 配列の全個数を 100、10,000、1,000,000 と変化させます。
- それぞれの個数の時、最初の値と最後の値で検索した時にかかる時間を調べます。
- Chromeブラウザを使います。(Safari、Edgeでもやりたい…)
for (let i = 1; i <= 3; i++) {
const length = Math.pow(100, i);
const last = length - 1;
const first = 0;
// 0からlength-1までの数で埋めたArrayとSetを用意
const array = Array.from({
length
}).map((_, i) => i);
const set = new Set(array);
console.log('-----');
console.log(length.toLocaleString());
// Array(最後の値)
console.time('array_last');
array.indexOf(last) !== -1;
console.timeEnd('array_last');
// Array(最初の値)
console.time('array_first');
array.indexOf(first) !== -1;
console.timeEnd('array_first');
// Set(最後の値)
console.time('set_last');
set.has(last);
console.timeEnd('set_last');
// Set(最初の値)
console.time('set_first');
set.has(first);
console.timeEnd('set_first');
}
結果
それぞれの条件で、最後の要素の検索にかかった時間(カッコ内は最初の要素)| ブラウザ | 件数 | Array | Set |
|---|---|---|---|
| chrome | 100 | 0.0068359375ms (0.008056640625ms) |
0.002685546875ms (0.005859375ms) |
| chrome | 10,000 | 0.024169921875ms (0.00390625ms) |
0.001953125ms (0.001953125ms) |
| chrome | 1,000,000 | 1.690185546875ms (0.003662109375ms) |
0.0029296875ms (0.004150390625ms) |
まとめ
もちろん new Set() しないといけないし、Arrayじゃないとダメな時もあるけど、検索にかかる時間をとにかく短くしたい!って時には良さそうです。しょしんしゃなので、まちがっているところがあったら、やさしくおしえてください。
おわり
コメント
コメントを投稿