大きなループ内で使用されているパフォーマンスの高いもの:.indexOf(str)または.match(regex)?
-
06-07-2019 - |
質問
ページにこのarray.prototypeがあり、多くの処理時間を浪費しているようです:
Array.prototype.findInArray = function(searchStr) {
var returnArray = false;
for (i=0; i<this.length; i++) {
if (typeof(searchStr) == 'function') {
if (searchStr.test(this[i])) {
if (!returnArray) { returnArray = [] }
returnArray.push(i);
}
} else {
var regexp = new RegExp(".*" + searchStr + ".*");
if (this[i].match(regexp)) {
if (!returnArray) { returnArray = [] }
returnArray.push(i);
}
}
}
return returnArray;
}
解決
まず、&quot;。*&quot;を持っている必要がないことを知っています。どちらの側でもねすでにデフォルトで正規表現は、文字列内のどこでも一致します。第二に、定数文字列を検索するだけで、正規表現が提供する高度なものを使用する必要がない場合は、 .indexOf()
を使用する方が間違いなく高速です。さらに、特別な意味を持つ文字をエスケープすることを心配する必要がなくなります。
他のヒント
正規表現は大きく異なる場合があります。単純で、巧妙に作られた正規表現は、indexOf()と同じかそれよりも速く動作すると思います。一方、複雑な正規表現はより多くの作業を行うため、より多くの時間が必要になります。
また、ブラウザの実装の問題であるクラウドの問題もあります。特定のニーズで各ブラウザーが各タイプの検出を行うのにかかる時間を測定するためのタイミングループを記述する以外には、確かな答えを得ることができません。
さらに悪いことに、ループの各反復で新しい正規表現オブジェクトを作成します。 ループの外側で一度定義するか、引数として渡します。
また、この用途では、 test は match よりも優れており、迅速です。
所属していません StackOverflow