Подтвердить что ты не робот

Как Firefox оптимизировал этот цикл?

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-битном режиме выигрывает математический метод. В 64-битном режиме выигрывает метод Loop. Просто подумал, что я должен указать на это.

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

4b9b3361

Ответ 1

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

browserscope

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

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

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

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

ff8 vs ff9

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

Интересно, что новая строка no-op намного длиннее в FF8, чем FF9.

Ответ 2

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

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

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

Ответ 3

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

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

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

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