Я пытался провести эксперимент, чтобы проверить, хранятся ли локальные переменные в функциях в стеке.Что заставляет эту функцию работать намного медленнее?
Так что я написал небольшой тест производительности
function test(fn, times){
var i = times;
var t = Date.now()
while(i--){
fn()
}
return Date.now() - t;
}
ene
function straight(){
var a = 1
var b = 2
var c = 3
var d = 4
var e = 5
a = a * 5
b = Math.pow(b, 10)
c = Math.pow(c, 11)
d = Math.pow(d, 12)
e = Math.pow(e, 25)
}
function inversed(){
var a = 1
var b = 2
var c = 3
var d = 4
var e = 5
e = Math.pow(e, 25)
d = Math.pow(d, 12)
c = Math.pow(c, 11)
b = Math.pow(b, 10)
a = a * 5
}
я ожидал, чтобы получить работу функции обратного развития гораздо быстрее. Вместо этого появился удивительный результат.
Пока я не проверю одну из функций, выполняемых в 10 раз быстрее, чем после тестирования второго.
Пример:
> test(straight, 10000000)
30
> test(straight, 10000000)
32
> test(inversed, 10000000)
390
> test(straight, 10000000)
392
> test(inversed, 10000000)
390
такое же поведение при испытании в альтернативном порядке.
> test(inversed, 10000000)
25
> test(straight, 10000000)
392
> test(inversed, 10000000)
394
Я проверил его как в браузере Chrome и в Node.js и у меня нет абсолютно никакого понятия, почему бы это случилось. Эффект длится до тех пор, пока я не обновляю текущую страницу или не перезапустите Node REPL.
Что может быть источником таких значительных (в 12 раз хуже) характеристик?
PS. Так как это работает только в некоторых условиях, напишите среду, которую вы используете для ее проверки.
Mine были:
ОС: Ubuntu 14,04
Узел v0.10.37
Chrome 43.0.2357.134 (Official Build) (64-разрядная версия)
/Edit
На Firefox 39 она занимает ~ 5500 мс для каждого теста независимо от порядка. Кажется, это происходит только на определенных двигателях.
/Edit2
Включение функции в тестовую функцию заставляет ее работать всегда в одно и то же время.
Возможно ли, что существует оптимизация, которая включает параметр функции, если она всегда является одной и той же функцией?
Мое предположение - это что-то с сборкой мусора. Сбор мусора создаст всплески использованной памяти, прежде чем собиратель придет и очистит все остатки. Это имеет значение, если вы переключаете порядок функций вокруг? – somethinghere
Попробуйте переключить свои тесты: сначала запустите против 'inversed', а затем против' straight'. – robertklep
Обе функции, похоже, занимают примерно одно и то же время в Firefox –