js の for/for in/for of の違い - パフォーマンス テストと詳細な比較分析

前書き:
プロジェクトに取り組んでいるときに、大量のデータの場合、ループ方法が異なると実際に時間とパフォーマンスにかなり大きな差があることがわかりました。データが数十個しかない場合はどれを使っても構いません 例えばデータが少なくパフォーマンスを考慮しない場合は for を直接使うと値が直接取得できるのでカッコいいですしたがって、シナリオが異なれば、依然として異なる方法で分析する必要があります。

この記事は、これらのタイプのループのパフォーマンス テストを実行することで、問題が発生したときにパフォーマンスを迅速に判断できるように、少しでも役立つことを願っています。

テストを開始します。
まず、テストのために長さ 1,000 万の配列を作成し、それに fill(0) を与えます。

//let arr=new Array(10000000)创造长度为一千万的数组
let arr=new Array(10000000).fill(0)


1. 異なる宣言での for と while のパフォーマンス
① var 宣言を使用すると、for と while はほぼ 24ms になります。(ループ回数が不明な場合は while を使用します)

//用for循环-----使用console自带计算时间的属性
console.time("for")
for(var i=0,i<arr.length,i++){}
console.timeEnd("for")

//输出for:24.49ms

//用while循环
console.time("while")
var i=0
for(i<arr.length){i++}
console.timeEnd("while")

//输出while:24.042ms

结论:在使用var时,for,while耗时都是24ms左右,性能差不多。


② let 文を使用するとパフォーマンスが良く、for 文は約 9ms、var 文は約 32ms です。

//用for循环
console.time("for")
for(let i=0,i<arr.length,i++){}
console.timeEnd("for")

//输出for:9.38379ms

//用while循环
console.time("while")
let i=0
for(i<arr.length){i++}
console.timeEnd("while")

//输出while:32.566162ms

结论:在使用let声明时,for性能更好。


③forEachは134.74ms

//用forEach
console.time("forEach")
arr.forEach(function(item){})
console.timeEnd("forEach")

//输出forEach:134.7458ms

概要:
1. var を使用して宣言します。for と while は似ていますが、どちらも約 24 ミリ秒です。(ループ回数が不明な場合は while を使用します)

2. let ステートメントを使用します。パフォーマンスが向上します。for ステートメントは約 9 ミリ秒、var ステートメントは約 32 ミリ秒です。
原則:解放されないグローバル変数はない。let はブロックレベルのスコープなので、終了後に for を解放することができます。


2. for in は
通常、オブジェクトを走査するために使用され、キーはキー、つまりキー名です。

//用for in
console.time("for in")
for (let key in arr){}
console.timeEnd("for in")

//输出for in:3593.74ms


上記のループ方法である for9ms と比較すると、for in のパフォーマンスは最も悪く3600ms 以上近く、速度差は 400 倍以上であることがわかります。
すべてのプライベートおよびパブリック プロパティを反復処理するため、プロトタイプ チェーンのレベルごとのチェックは非常にパフォーマンスを消費します。
多くの問題があります: シンボルを反復できない、反復順序の数が優先、パフォーマンスが低い、時間がかかる、列挙可能なすべての属性が反復される、プライベート/共有される。

3. for of は 
通常、配列を走査するために使用され、値 (要素値) がループアウトされます。

//用for of
console.time("for of")
for (const val of arr){console.log(val)}
console.timeEnd("for of")

//输出for of:327.006ms

パフォーマンス テストには 300 ミリ秒以上かかります。
for...of は通常のオブジェクトをループできません。Object.keys() と組み合わせて使用​​する必要がありますが、これは少し冗長です。
最下層: イテレータの仕様に従ってトラバースします。
イテレータの仕様: next メソッドが存在する必要があり、実行ごとに構造体の値が取得されます。属性には、done 属性と value 属性があります。
完了: 反復が完了したかどうか、値: 毎回取得される値。

以上、個人的な研究と講義のまとめですが、前回の講義概要のイテレータに関するコードですが、自分なりにとてもすっきりしたので、参考までに公開します。

 最終的なまとめ:
 

1. for/while は
var で宣言されています。for と while は似ており、どちらも約24msです(サイクル数が不確かな場合は while を使用します)
let ステートメントを使用すると、パフォーマンスが向上し、for ステートメントは約9ms、var ステートメントは約 32ms になります。
foreach は約 130ms です。

2. for in
for in は通常、オブジェクトを走査するために使用されキーはキー名である key です。
パフォーマンスは最悪です 約3600msとforと400倍違います データ量が多い時はピットを踏まないように注意して使用してください すべてのプライベート属性とパブリック属性を反復するため、プロトタイプチェーン
レベル-レベルごとの検索はパフォーマンスを大量に消費します。
問題: パフォーマンスが悪く、シンボルを反復できず、反復順序の数が優先されます。

3. for of は 
通常、配列を走査するために使用され(要素値) がループアウトされます。通常のオブジェクトはループできません。
パフォーマンス:約327 ミリ秒
最下層: イテレータの仕様に従ってトラバースします。
イテレータの仕様: next メソッドが存在する必要があり、実行ごとに構造体の値が取得されます。属性には、done 属性と value 属性があります。
完了: 反復が完了したかどうか、値: 毎回取得される値。

おすすめ

転載: blog.csdn.net/m0_71981318/article/details/125741907
おすすめ