Я пытаюсь провести эксперимент, чтобы увидеть, хранятся ли локальные переменные в функциях в стеке.
Итак, я написал небольшой тест производительности
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. Поскольку он работает только в некоторых средах, напишите среду, которую вы используете для ее проверки.
Мои были:
ОС: Ubuntu 14.04
Node v0.10.37
Chrome 43.0.2357.134 (Official Build) (64-разрядная версия)
/Edit
В Firefox 39 для каждого теста требуется ~ 5500 мс независимо от порядка. Кажется, что это происходит только на определенных двигателях.
/Edit2
Включение функции в тестовую функцию заставляет ее работать всегда в одно и то же время.
Возможно ли, что существует оптимизация, которая строит параметр функции, если она всегда является одной и той же функцией?