Firefox schlechte RegEx-Leistung

Ich benutze den JavaScript-Parser-GeneratorJISON um einen Parser für einige Skripte zu erstellen, die meine Benutzer erstellen. In letzter Zeit ist mir aufgefallen, dass der Parsing-Prozess in Firefox um einen großen Faktor langsamer ist als in jedem anderen Browser, den meine Seite unterstützt (IE10, neuestes Chrome & Opera).

Nachdem ich mich ein wenig mit der Quelle des generierten Parsers befasst habe, habe ich das Problem auf eine Codezeile eingegrenzt, die einen regulären Ausdruck ausführt, um den zu analysierenden Code zu tokenisieren. Natürlich wird diese Zeile ziemlich oft ausgeführt.

Ich habe einen kleinen Testfall mit einer zufälligen Zeichenfolge (~ 1300 Zeichen lang) und einem ziemlich generischen regulären Ausdruck erstellt. Dieser Testfall misst die durchschnittliche Zeit, die zum Ausführen des Regex 10000 Mal benötigt wird (Arbeitsbeispiel für JSFiddle):

$(document).ready(function() {
    var str = 'asdfasdfa asdfasdf asdf asdf asdfasödlfkja asldfkj asdölkfj aslödkjf aösldkfj ölkasjd flöaksjdf löask dfjkasdfasdfa asdfasdf asdf asdf asdfasödlfkja asldfkj asdölkfj aslödkjf aösldkfj ölkasjd flöaksjdf löask dfjkasdfasdfa asdfasdf asdf asdf asdfasödlfkja asldfkj asdölkfj aslödkjf aösldkfj ölkasjd flöaksjdf löask dfjkasdfasdfa asdfasdf asdf asdf asdfasödlfkja asldfkj asdölkfj aslödkjf aösldkfj ölkasjd flöaksjdf löask dfjkasdfasdfa asdfasdf asdf asdf asdfasödlfkja asldfkj asdölkfj aslödkjf aösldkfj ölkasjd flöaksjdf löask dfjkasdfasdfa asdfasdf asdf asdf asdfasödlfkja asldfkj asdölkfj aslödkjf aösldkfj ölkasjd flöaksjdf löask dfjkasdfasdfa asdfasdf asdf asdf asdfasödlfkja asldfkj asdölkfj aslödkjf aösldkfj ölkasjd flöaksjdf löask dfjkasdfasdfa asdfasdf asdf asdf asdfasödlfkja asldfkj asdölkfj aslödkjf aösldkfj ölkasjd flöaksjdf löask dfjkasdfasdfa asdfasdf asdf asdf asdfasödlfkja asldfkj asdölkfj aslödkjf aösldkfj ölkasjd flöaksjdf löask dfjkasdfasdfa asdfasdf asdf asdf asdfasödlfkja asldfkj asdölkfj aslödkjf aösldkfj ölkasjd flöaksjdf löask dfjkasdfasdfa asdfasdf asdf asdf asdfasödlfkja asldfkj asdölkfj aslödkjf aösldkfj ölkasjd flöaksjdf löask dfjkasdfasdfa asdfasdf asdf asdf asdfasödlfkja asldfkj asdölkfj aslödkjf aösldkfj ölkasjd flöaksjdf löask dfjkasdfasdfa asdfasdf asdf asdf asdfasödlfkja asldfkj asdölkfj aslödkjf aösldkfj',
        regex = new RegExp('^([0-9])+'),
        durations = [],
        resHtml = 'Durations:',
        totalDuration = 0,
        matches, start;

    // Perform "timing test" 10 times to get some average duration
    for (var i = 0; i < 10; i++) {
        // Execute regex 10000 times and see how long it takes
        start = window.performance.now();
        for (var j = 0; j < 10000; j++) {
            regex.exec(str);
        }
        durations.push(window.performance.now() - start);
    }

    // Create output string and update DIV
    for (var i = 0; i < durations.length; i++) {
        totalDuration += durations[i];
        resHtml += '<br>' + i + ': ' + (parseInt(durations[i] * 100, 10) / 100) + ' ms';
    }
    resHtml += '<br>==========';
    resHtml += '<br>Avg: ' + (parseInt((totalDuration / durations.length) * 100, 10) / 100) + ' ms';

    $('#result').html(resHtml);
});

Im Folgenden sind die Testergebnisse auf meinem Computer aufgeführt:

Firefox 24: Durchschnittliche Zeit liegt zwischen370 & 450 ms für 10000 Regex-Ausführungen
Chrome 30, Opera 17, IE 10: Durchschnittliche Zeit liegt zwischen0,3 & 0,6 ms

Dieser Unterschied wird noch größer, wenn die zu testende Zeichenfolge größer wird. Eine 6000 Zeichen lange Zeichenfolge erhöht die durchschnittliche Zeit in Firefox auf~ 1,5 Sekunden (!) während die anderen browser noch brauchen~ 0,5 Millisekunden (!) (Arbeitsbeispiel für JSFiddle mit 6000 Zeichen).

Warum gibt es einen so großen Leistungsunterschied zwischen Firefox und allen anderen Browsern und kann ich ihn trotzdem verbessern?

Bitte beachten Sie, dass ich die ausgeführten Regexes-Themeselves nicht anpassen kann, da sie meistens vom Parser-Generator generiert werden und ich den erstellten Parser-Code nicht manuell ändern möchte.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage