Firefox плохая производительность RegEx

Я использую генератор парсера JavaScriptJISON создать парсер для некоторых скриптов, которые создают мои пользователи. В последнее время ямы заметили, что процесс синтаксического анализа в Firefox значительно медленнее, чем в любом другом браузере, который поддерживает моя страница (IE10, последняя версия Chrome & Opera).

Немного покопавшись в источнике сгенерированного парсера яМы сузили проблему до одной строки кода, которая выполняет некоторое регулярное выражение для токенизации кода для анализа. Конечно, эта строка выполняется довольно часто.

Мы создали небольшой тестовый случай с некоторой случайной строкой (длиной ~ 1300 символов) и довольно общим регулярным выражением. Этот тестовый пример измеряет среднее время, необходимое для выполнения регулярного выражения 10000 раз (Рабочий пример на 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);
});

Ниже приведены результаты теста на моей машине:

Firefox 24: Среднее время между370 & 450 мс за 10000 казней регулярных выражений

Chrome 30, Opera 17, IE 10: Среднее время между0,3 & 0,6 мс

Эта разница становится еще больше, если строка для тестирования становится больше. Строка длиной 6000 символов увеличивает среднее время в Firefox до~ 1,5 секунды (!) в то время как другие браузеры все еще нуждаются~ 0,5 миллисекунды (!) (Рабочий пример на JSFiddle с 6000 символов).

Почему между Firefox и всеми другими браузерами такая большая разница в производительности, и могу ли я ее как-нибудь улучшить?

Обратите внимание, что я могуне корректируйте выполненные регулярные выражения, потому что они в основном генерируются генератором парсера, а я неЯ не хочу вручную изменять код встроенного парсера.

Ответы на вопрос(1)

Ваш ответ на вопрос