Hallo ursus,
es ist gar nicht so einfach, das zu benchmarken, weil ich zumindest beim Firefox Laufzeiten bekomme die sich nur durch "wegoptimieren" erklären lassen. um Umfeldeinflüsse auszuschließen, habe ich die Messschleife mal so geändert:
Schleife 1 - soll eine Baseline liefern.
let q = [];
for ( let i=1; i < 1000; i++ ) {
for ( let p = 0; p < len; p++ ) {
let tt = s[p];
q.push(s)
}
}
Läuft im Fuchs (v60.3 esr) unter 20ms durch. Chrome (v70) gut 30ms.
Schleife 2 - konstanter Replace:
let q = [];
for ( let i=1; i < 1000; i++ ) {
for ( let p = 0; p < len; p++ ) {
let tt = s[p];
q.push(s.replace('a', ' '));
}
}
Firefox etwas über 20ms. Chrome um 400-500ms (starke Schwankungen, verdammte virtuelle Maschine). Das bedeutet jetzt nicht, dass der Fuchs beim Replace rasend schnell ist, sondern dass der schlaue Fuchs offenbar erkannt hat dass hier eine Operation herausfaktoriert werden konnte.
Schleife 3 - variabler Replace:
let q = [];
for ( let i=1; i < 1000; i++ ) {
for ( let p = 0; p < len; p++ ) {
let tt = s[p];
q.push(s.replace(tt, ' '));
}
}
Firefox jetzt bei 250-300ms, mit Ausreißern unter 200 und über 400. Chrome unverändert.
D.h. die hochgelobte V8 Engine von Chrome ist hier tatsächlich vom Mozilla-Fuchs abgehängt worden. Ist natürlich nicht repräsentativ für allgemeine Performance.
Mit Objekten sieht das so aus:
Schleife 1: Fuchs 130-140ms, Chrome ebenso, scheint leicht langsamer
Schleife 2: Fuchs um 1400ms!!!!, Chrome um 750ms
Schleife 3: Zeiten unverändert.
Hier ist die Mozilla-Herrlichkeit am Ende.
Aber egal ob V8 oder Spidermonkey, es ist viel langsamer, das String-Objekt vorzuhalten statt ihn beim Aufruf ständig boxen zu lassen. Offenbar ist dieses Boxing eine Lüge für Kinder und die Wahrheit ist ganz anders...
Rolf
sumpsi - posui - clusi