JavaScriptのパフォーマンスの問題に取り組んでいます。だから私は尋ねたいだけです:文字列が別の部分文字列を含むかどうかを確認する最も速い方法は何ですか(私はブール値だけが必要ですか?)あなたのアイデアとサンプルスニペットコードを提案していただけませんか?
JavaScriptのパフォーマンスの問題に取り組んでいます。だから私は尋ねたいだけです:文字列が別の部分文字列を含むかどうかを確認する最も速い方法は何ですか(私はブール値だけが必要ですか?)あなたのアイデアとサンプルスニペットコードを提案していただけませんか?
回答:
次の2つの可能性があります。
正規表現の方が速いようです(少なくともChrome 10では)。
パフォーマンステスト-短い干し草
パフォーマンステスト-長い干し草
どちらの方法が速いかは確実とは言えません。ブラウザ間の違いは非常に大きいです。Chrome 10 indexOf
では高速のようですが、Safari 5ではindexOf
他のどの方法よりも明らかに低速です。
自分の目で確かめてみてください。それはあなたのニーズに依存します。たとえば、正規表現を使用すると、大文字と小文字を区別しない検索がはるかに高速になります。
2018年更新:
人々がテストを実行するのを避けるために、最も一般的なブラウザの現在の結果を示します。パーセンテージは、次に速い結果(ブラウザによって異なります)よりもパフォーマンスが向上していることを示しています。
Chrome: indexOf(〜98%高速)<-- wow
Firefox:キャッシュされたRegExp(〜18%高速)
IE11:キャッシュされたRegExp(〜10%高速)
Edge: indexOf(〜18%高速)
Safari:キャッシュされたRegExp(〜0.4%高速)
注正規表現をキャッシュしては次のとおりです。var r = new RegExp('simple'); var c = r.test(str);
とは反対に:/simple/.test(str)
indexOf
してOffice 2013アプリを作成していますが、使用できません。理由はわかりません。ただし、正規表現を使用することはできます。これはエッジケースですが、同じ問題が発生する場合もあります。
これはうまくいきますか?
string1.indexOf(string2) >= 0
編集:string2に繰り返しパターンが含まれている場合、これはRegExpよりも速くない可能性があります。一部のブラウザでは、indexOfがRegExpよりもはるかに遅い場合があります。コメントを参照してください。
編集2:文字列が非常に長い、または繰り返しパターンを含む場合、RegExpはindexOfよりも高速になる場合があります。コメントと@Felixの回答を参照してください。
test
。
indexOf
他のどの方法よりも遅い等級です。したがって、実際にはどちらの方法が速いかはわかりません。ブラウザによって異なります。
最速
var string = "hello"、 substring = "lo"; string.includes(substring);
var string = "hello"、 substring = "lo"; string.indexOf(substring)!== -1;
ES6では、このincludes()
メソッドを使用して、1つの文字列が別の文字列内で見つかるかどうかを判断し、返されるtrue
かfalse
、必要に応じて返します。
var str = 'To be, or not to be, that is the question.';
console.log(str.includes('To be')); // true
console.log(str.includes('question')); // true
console.log(str.includes('nonexistent')); // false
ここにjsperfがあります
var ret = str.includes('one');
そして
var ret = (str.indexOf('one') !== -1);
jsperfで示した結果のように、どちらもうまく機能しているようです。
str.includes("x|y")
; 同じ呼び出しでリテラル「x」または「y」を検索します。
regex
それを使用することはできません。あなたの質問に対する1つの回避str.includes("x") || str.includes('y')
indexOf
よりも大幅に高速になっていますincludes
(1600%以上高速)。4400万反復/秒と7億7700万 i /秒の違いが実際のパフォーマンスにどのように影響するかは不明ですが、モバイルindexOf
は、理想的な選択であるはずの十分な利益をもたらす可能性があります。
単純なforループを使用して、文字列内のすべての要素を反復処理し、を使用して比較するとcharAt
、indexOf
またはよりも高速に実行されることがわかりましたRegex
。コードと証明はJSPerfで入手できます。。
ETA:indexOf
とcharAt
の両方jsperf.comに記載されているブラウザスコープデータに応じてクロムモバイルに同様にひどい行います
単純な文字列を見つけるための、のindexOf()メソッドを使用して正規表現を使用することはほとんど同じです:http://jsperf.com/substring -ので、書き込みに簡単に思える今まで一つは選択してください。
私はあなたのためにjsben.chを作成しましたhttp://jsben.ch/#/aWxtF ... indexOfが少し速いようです
これは、.match()
メソッドを使用して文字列を作成する簡単な方法です。
var re = /(AND|OR|MAYBE)/;
var str = "IT'S MAYBE BETTER WAY TO USE .MATCH() METHOD TO STRING";
console.log('Do we found something?', Boolean(str.match(re)));
良い一日でありますように
match
が存在する理由はありませんtest
…一番上の答えを確認してください。
regex
ですか(タグの使用に少し混乱しています)?