我经常在函数中使用可选参数,但一些测试显示它们在 Firefox 和 safari 中性能受到巨大影响(70-95%)。奇怪的是,如果我传入文字值不明确的那么就没有处罚。这里可能发生什么?我不会认为这是一个作用域链问题,因为它们本质上是函数的本地问题。我要开始通过吗不明确的每个可选参数?
jsPerf: http://jsperf.com/function-undefined-args/2 http://jsperf.com/function-undefined-args/2
对于这样的函数:
function threeArgs(x, y, z) {
return x + y + z;
}
就是这样称呼的:
threeArgs(1, 2, 3);
优化器可以自由选择不生成任何代码。它很容易确定没有副作用,因为该函数只是引用其参数值并返回简单表达式的结果。由于返回值被忽略,因此运行时根本没有理由执行任何操作。
除此之外,如果代码是:
something += threeArgs(1, 2, 3);
优化器可能决定生成大致相当于以下内容的代码:
something += 6;
为什么?因为调用是使用数字常量进行的,并且它可以在代码生成时安全地折叠这些常量。这可能是保守的,因为数字很奇怪,但这里它们都是整数,所以它可以很好地做到这一点。即使没有,它也可以安全地内联该函数:
something += 1 + 2 + 3;
然而,当缺少参数时,优化器可能会退出并生成真正的函数调用。对于这样一个简单的函数,函数调用的开销很容易导致性能上的巨大差异。
通过在测试中使用变量而不是常量,并实际使用函数的返回值,您可以“迷惑”优化器并防止它跳过调用或预先计算结果,但您无法阻止它内联。我仍然认为你的结果很有趣,因为这个原因:它揭示了这样一个事实:(无论如何,截至今天)这些优化器对函数的调用方式很敏感。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)