Как Firefox оптимизировал этот цикл? - PullRequest
35 голосов
/ 28 декабря 2011

Firefox 9.0.1 удивил меня, обнаружив алгоритм заполнения чисел Ω (log n) с помощью метода петли Ω (n), когда n мало. В любом другом браузере, который я видел, цикл медленнее , даже для небольших значений n.Я знаю, что все браузеры работают над оптимизацией JS, но поскольку все другие современные браузеры показывают, что цикл работает медленнее, есть ли объяснение поведению в Firefox 9?

// Ω(log n)
function padNumberMath(number, length) {
    var N = Math.pow(10, length);
    return number < N ? ("" + (N + number)).slice(1) : "" + number
}

// Ω(n):
function padNumberLoop(number, length) {
    var my_string = '' + number;
    while (my_string.length < length) {
        my_string = '0' + my_string;
    }
    return my_string;
}

Обновление: Я не думаю, что это связано с первоначальным вопросом, но я только что обнаружил, что IE 9 переключает поведение при переключении с 32- на 64-битные режимы.В 32-битном режиме метод Math побеждает.В 64-битном режиме метод Loop побеждает.Просто подумал, что я должен указать на это.

Обновление 2: MAK поймал меня в своем комментарии ниже.Математический метод - это не Ω (1), скорее он больше похож на Ω (log n).

Ответы [ 3 ]

11 голосов
/ 28 декабря 2011

Глядя на результаты , совершенно ясно, что Firefox не сделал ничего для достижения производительности усиление .

browserscope

Эти столбцы можно читать как «скорости» (операций / сек), поэтому большие столбцы лучше .Все в масштабе.

В Firefox 9 очень ясно, что метод "Math" работает ужасно, хотя между версиями метода "Loop" мало изменений.

Таким образом, было no "оптимизация" любого рода в Firefox 9. Все, что произошло между Firefox 8 и 9 в отношении этих тестов, так или иначе, их математическая библиотека стала медленнее (Math.pow медленная), илиих библиотека строк стала медленнее (.slice() медленнее).

Если посмотреть дальше, становится ясно каким-то образом эти элементарные операции стали немного медленнее в ff9 :

ff8 vs ff9

Конкатенация и Math.pow немного медленнее в FF 9, чем в FF 8, что может объяснить разницу, которую вы видите в своих тестах.

Интересно , новый запрет на работу в FF8 намного длиннее, чем в FF9.

3 голосов
/ 28 декабря 2011

Это может быть быстрое копирование массива строки параметров в новый массив символов, который, возможно, по умолчанию инициализируется соответствующим символом, в данном случае цифрой.

Возможно, что-то в распознавании рекурсивного присваивания, включающего константу, позволяет быстро объединить строку length-mystring.length + 1 '0 с mystring.

С другой стороны, это может быть что-то столь же простое, как возведение в степень Firefox, становящееся небрежным, когда не используется двоичное расширение экспоненты для повторного возведения в квадрат.

0 голосов
/ 28 декабря 2011

Firefox 9.0.1 удивил меня, обнаружив мой алгоритм заполнения чисел Ω (1) с помощью метода петли Ω (n), когда n мало.

Разве в этом предложении не пропущены некоторые части? Он показывался как быстрее , или как? И почему вы объединяете пустые String с Number с? Почему бы просто не построить String?

И да, ваш O (1) действительно O (log) ...

В любом случае, объяснение, вероятно, связано с Выводом типа в Firefox 9

...