我经常在函数中有可选参数,但是一些测试在Firefox和safari(70-95%)中显示出巨大的性能.奇怪的是,如果我传递文字值未定义,那么没有罚款.这里可能发生什么?我不会认为这是一个范围链的问题,因为它们本身就是本地的功能.我是否开始通过未定义的每个可选参数?
解决方法
对于这样的功能:
function threeArgs(x,y,z) { return x + y + z; }
这就是所谓的:
threeArgs(1,2,3);
优化器可以自由选择生成任何代码.它很容易确定没有副作用,因为函数只是引用其参数值并返回一个简单的表达式的结果.由于返回值被忽略,所以运行时没有任何理由去做任何事情.
除此之外,如果代码是:
something += threeArgs(1,3);
something += 6;
为什么?因为这个调用是用数字常量进行的,它可以安全地折叠代码生成时间.这可能是保守的,因为数字是奇怪的,但在这里它们都是整数,所以它可以做到这一点.即使没有,它可以安全地排列功能:
something += 1 + 2 + 3;
然而,当有一个参数丢失时,可能是优化器保释并生成一个真正的函数调用.对于这样一个简单的功能,函数调用的开销很容易解释性能差异很大.
通过在测试中使用变量而不是常量,并且通过实际使用函数的返回值,您可以“混淆”优化器,并使其不会跳过调用或预先计算结果,但是不能将其保留内联.我仍然认为你的结果是有趣的,因为这个原因:它揭示了(从今天起),这些优化器对调用函数的方式很敏感.