2017-09-04 4 views
1

Also, in JavaScript, muss ich überprüfen, haben eine einfache, schnelle Möglichkeit zu überprüfen, ob eine Zeichenfolge der Länge 1 gehört zu einer Reihe von Zeichen, wie ist es ein String-Zeichen für eine Javascript-ID?Ist die Regex-Suche effizienter als die Suche nach einem Schlüssel in einem Objekt als Set?

Ich schrieb den folgenden Test:

//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 
*/ 

Etwas Seltsames ist hier, auf einer einheitlichen Grundlage, die Überprüfung für einen Schlüssel in einem Objekt, das ist als eine Menge definiert schien ein Zeichen weit schneller zu sein, als zu tun Regex-Übereinstimmung Warum ist das der Fall? Sollte die Regex hier nicht schneller sein?

+1

Was lässt Sie denken, dass es sollte? – Bergi

+0

Ihre Microbenchmark ist ziemlich fehlerhaft, traue ihr nicht. Vergleichen Sie Ihre reale Anwendung mit zwei verschiedenen Ansätzen. – Bergi

+0

Haben Sie überlegt, ein 'Set' zu verwenden? – Bergi

Antwort

0

Nach Ihren Angaben, nein; Ein Regex ist nicht schneller als ein Satz.

Dies ist weil eine Regex muss kompiliert werden, bevor es ausgeführt werden kann. Während Sie diese Zahlen verbessern könnten, indem Sie die Regex vorkompilieren, ist eine Regex allgemeiner als eine Menge oder eine einfache alte Schleife, so dass sie vom Interpreter weniger optimiert werden können.

Verwandte Themen