BETA

【JavaScript】Array.prototype.includes と Array.length の速度比較

投稿日:2019-06-18
最終更新:2019-06-18

これはなに

以下の条件式を書く場合、どちらが左にあるべきか?
という問いに対する調査と回答。

array.length === 0 || array.includes(e)  

なお、両者の真偽値の頻度には偏りがないとする。

計測コード

performance.measure を利用する。

// 100 * 1000 オーダーの配列を用意  
numbers = [...Array(100 * 1000).keys()];  

// a~d計測点間で各処理を走らせる  
performance.mark('a');  
for (_ in numbers) { numbers.length; }  
performance.mark('b');  
for (_ in numbers) { numbers.length === 100 * 1000; }  
performance.mark('c');  
for (_ in numbers) { numbers.includes(1); }  
performance.mark('d');  
for (_ in numbers) { numbers.includes(99 * 1000); }  
performance.mark('e');  

// 各計測点間の時間を取得して表示  
performance.measure('lengthA', 'a', 'b');  
performance.measure('lengthB', 'b', 'c');  
performance.measure('includesA', 'c', 'd');  
performance.measure('includesB', 'd', 'e');  
console.log(performance.getEntriesByType("measure"));  

計測結果

0: PerformanceMeasure  
duration: 20.605000026989728  
entryType: "measure"  
name: "lengthA"  
startTime: 1598.4799999860115  

1: PerformanceMeasure  
duration: 26.870000001508743  
entryType: "measure"  
name: "lengthB"  
startTime: 1619.0850000130013  

2: PerformanceMeasure  
duration: 16.56999997794628  
entryType: "measure"  
name: "includesA"  
startTime: 1645.95500001451  

3: PerformanceMeasure  
duration: 2964.8500000475906  
entryType: "measure"  
name: "includesB"  
startTime: 1662.5249999924563  

includes はどうやら配列のインデックスの小さい方から順番に走査している模様。
配列が巨大な場合は includes を右に置いておく、ぐらいの認識で良いだろう。

参考リンク

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

備忘録のようなもの

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!