rob*_*obC 10 javascript performance arguments
我经常在函数中有可选的参数,但是一些测试在firefox和safari中显示出巨大的性能影响(70-95%).奇怪的是,如果我传入未定义的文字值,那么就没有惩罚.这可能发生什么?我不会认为它是一个范围链问题,因为它们本身就是函数的本地.我是否开始将undefined传递给每个可选参数?
jsPerf:http://jsperf.com/function-undefined-args/2
对于这样的函数:
function threeArgs(x, y, z) {
return x + y + z;
}
Run Code Online (Sandbox Code Playgroud)
这就是这样的:
threeArgs(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)
优化器可以自由选择不生成任何代码.它很容易确定没有副作用,因为函数只是引用其参数值并返回简单表达式的结果.由于返回值被忽略,因此运行时没有理由做任何事情.
除此之外,如果代码是:
something += threeArgs(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)
优化器可能决定生成大致相当于的代码:
something += 6;
Run Code Online (Sandbox Code Playgroud)
为什么?因为调用是使用数字常量进行的,所以它可以在代码生成时安全地折叠它们.它可能是保守的,因为数字很奇怪,但在这里它们都是整数,所以它可以做到这一点.即使它没有,它可以安全地内联函数:
something += 1 + 2 + 3;
Run Code Online (Sandbox Code Playgroud)
但是,当缺少参数时,可能是优化器挽救并生成实际函数调用.对于这样一个简单的函数,函数调用的开销可以很容易地解决性能上的巨大差异.
通过在测试中使用变量而不是常量,并通过实际使用函数的返回值,您可以"混淆"优化器并防止它跳过调用或预先计算结果,但是您无法保留它内联.我仍然认为你的结果很有意思:它暴露了这样一个事实:截至今天,这些优化器对调用函数的方式很敏感.
| 归档时间: |
|
| 查看次数: |
479 次 |
| 最近记录: |