2017-09-04 4 views
1

JavaScriptでは、長さ1の文字列が、JavaScriptの識別子の文字列文字などの文字セットに属しているかどうかを確認する簡単で迅速な方法を確認する必要がありますか?正規表現は、オブジェクトのキーをセットとしてチェックするより効率的ですか?

私は次のテストを書いた:セットは一つの文字を行うよりもはるかに速いように見えたとして、ここで奇妙な

//performance test for matching 

var re = /[a-zA-Z$_]/; 

console.time("regex"); 
for(var i=0;i<100000;i++) re.test("_"); 
console.timeEnd("regex"); 

var objs = {"_":true, 0:true, 1:true, 2:true, 3:true, 4:true, 5:true, 6:true, 7:true, 8:true, 9:true, a:true, b:true, c:true, d:true, e:true, f:true, g:true, h:true, "i":true, j:true, k:true, 
    l:true, m:true, n:true, o:true, p:true, q:true, r:true, t:true, $:true 
}; 


console.time("objcheck"); 
for(var i=0;i<100000;i++) "_" in objs; 
console.timeEnd("objcheck"); 
/* 
regex: 10ms 
objcheck: 1ms 
*/ 

何かは、一貫して、オブジェクトにキーをチェックすると、定義されてthatsのさ正規表現マッチ。これはなぜですか?正規表現はここで速くすべきではないか?

+1

あなたはそれがすべきだと思いますか? – Bergi

+0

マイクロベンチマークには欠陥があり、信頼できません。 2つの異なるアプローチを使用して実際のアプリケーションをベンチマークします。 – Bergi

+0

'Set'を使うことを考えましたか? – Bergi

答えて

0

あなたのデータによると、正規表現はセットより高速ではありません。

これは、正規表現を実行する前にコンパイルする必要があるためです。正規表現をあらかじめコンパイルすることでこれらの数値を向上させることができますが、正規表現はセットまたは普通の古いループより汎用的です。したがって、インタープリタによって最適化される数は少なくなります。

関連する問題