Как 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).
Ответы
Ответ 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