Jim*_*inP 9 javascript performance firefox google-chrome
两天前,当我发现jsperf.com收集了许多javascript性能测试时,我浏览了几个测试.
其中一个测试是这样,与之相比,Math.min(a,b)VS a<b?a:b.当我在谷歌浏览器上运行此测试时,结果证明它a<b?a:b比Math.min(a,b)(在Chrome 14上,第一个53,661,381 ops/s和第二个419,830,711 ops/s)快得多.其他Web浏览器也有类似的结果.
但是,在Firefox上,结果是相反的.Math.min(a,b)要快得多a<b?a:b!第一个是374,219,869 ops/s第二个,第二个是79,490,749 ops/s在Firefox 6上.

当我在Facebook上发布此消息时,有人说"由于Firefox是开源项目,开发人员进行了优化Math.min,但谷歌Chrome没有,因为谷歌Chrome只是Chromium的修改",但(除了以上声明并不完全正确)这没有任何意义,因为这并不能解释为什么谷歌Chrome a<b?a:b和Firefox Math.min(a,b)以相似的速度运行,而谷歌Chrome Math.min(a,b)和Firefox的a<b?a:b速度相同,因为如果Firefox比谷歌Chrome更快,那么谷歌Chrome Math.min(a,b)应该比Firefox的a<b?a:b.
摘要:
a<b?a:b速度比Math.min(a,b).Math.min(a,b)速度要快于a<b?a:b.Math.min(a,b)Firefox上的速度≒ a<b?a:b谷歌Chrome的速度和a<b?a:bFirefox上的速度≒ Math.min(a,b)谷歌Chrome 的速度,"Firefox很慢"或"Firefox很快"不能成为原因.有没有理由(如何)这种情况发生?
这里有一些事情发生.
首先,在Firefox 6中有两种不同的JIT编译器:TraceMonkey和JaegerMonkey.哪一个用于给定的代码取决于一些启发式; 这些启发式方法倾向于使用TraceMonkey来处理带有函数调用的代码.碰巧的是,对于简单的代码,TraceMonkey几乎总是比JaegerMonkey更快; 特别是这里提供的两个代码片段就是这种情况.
在这个特定的基准测试中,Math.min代码路径使用Tracemonkey进行编译,因为它是一个函数调用.使用JaegerMonkey编译三元运算符代码路径.
您可以通过转到about:config,放入jit过滤器字段并禁用TraceMonkey(列表中的tracejit)和JaegerMonkey(methodjit)中的一个或两个来进行试验.如果你这样做,你会发现在这个特定的基准测试中,三元运算符比Math.min单独的每个编译器更快,所以与其他浏览器相比,你看到的反转只是使用不同编译器的函数.
现在为什么Math.min通常比三元运算符慢...首先它必须做更多的工作; 如果仔细测试,它返回的答案与三元运算符不同.其次,它通常被实现为函数调用,这是大多数开销来自的地方(尽管TraceMonkey实际上在生成的代码中明确地内联它,这就是为什么两个片段的性能在TraceMonkey中没有那么不同).
| 归档时间: |
|
| 查看次数: |
465 次 |
| 最近记录: |