我一直在尝试做一个实验,看看函数中的局部变量是否存储在堆栈上。
所以我写了一些性能测试
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 倍。
Example:
> 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 倍)性能的来源是什么?
附言。由于它似乎仅在某些环境中工作,因此请编写您用来测试它的环境。
我的是:
操作系统:Ubuntu 14.04
节点 v0.10.37
Chrome 43.0.2357.134(官方版本)(64 位)
/Edit
在 Firefox 39 上,无论顺序如何,每次测试都需要约 5500 毫秒。它似乎只发生在特定的引擎上。
/Edit2
将函数内联到测试函数使其始终同时运行。
如果函数参数始终是相同的函数,是否可能存在内联函数参数的优化?