gpt4 book ai didi

javascript - 为什么 Firefox 和其他浏览器在计算哪个数字更大时表现相反?

转载 作者:数据小太阳 更新时间:2023-10-29 03:51:33 26 4
gpt4 key购买 nike

两天前,当我找到jsperf.com里面有很多javascript性能测试的集合,我浏览了几个测试。

其中一项测试是 this , 它比较 Math.min(a,b)对比a<b?a:b .当我在 Google Chrome 上运行这个测试时,结果是 a<b?a:bMath.min(a,b) 快得多(在 Chrome 14 上,第一个是 53,661,381 ops/s,第二个是 419,830,711 ops/s)。其他网络浏览器也有类似的结果。

但是在firefox上,结果恰恰相反。 Math.min(a,b)a<b?a:b 快得多!第一个是 374,219,869 ops/s第二个是79,490,749 ops/s在 Firefox 6 上。

enter image description here

当我在 Facebook 上发布这个时,有人说“由于 Firefox 是开源项目,开发人员优化了 Math.min ,但 Google Chrome 没有,因为 Google Chrome 只是 Chromium 的修改版”,但是(除上述之外声明不太正确)没有意义,因为这不能解释谷歌浏览器的 a<b?a:b 的原因。和 Firefox 的 Math.min(a,b)执行速度相似,谷歌浏览器的 Math.min(a,b)和 Firefox 的 a<b?a:b以相同的速度执行,因为如果 Firefox 比 Google Chrome 快,那么 Google Chrome 的 Math.min(a,b)应该比 Firefox 的 a<b?a:b 慢得多.

总结:

  1. 在其他浏览器上,a<b?a:bMath.min(a,b) 快.
  2. 但是,在 Firefox 上,Math.min(a,b)a<b?a:b 快.
  3. 由于速度Math.min(a,b)在 Firefox 上 ≒ a<b?a:b 的速度在 Google Chrome 上,速度为 a<b?a:b在 Firefox 上 ≒ Math.min(a,b) 的速度在 Google Chrome 上,“Firefox 很慢”或“Firefox 很快”都不是理由。

为什么(如何)发生这种情况有什么原因吗?

最佳答案

这里发生了一些事情。

首先,在 Firefox 6 中有两种不同的 JIT 编译器:TraceMonkey 和 JaegerMonkey。给定的代码使用哪一个取决于一些启发式方法;这些启发式方法倾向于使用 TraceMonkey 来处理带有函数调用的代码。不过,碰巧对于足够简单的代码,TraceMonkey 几乎总是比 JaegerMonkey 快;特别是此处显示的两个代码片段就是这种情况。

在这个特定的基准测试中,Math.min 代码路径使用 Tracemonkey 进行编译,因为它是一个函数调用。三元运算符代码路径使用 JaegerMonkey 编译。

您可以通过转到 about:config 进行试验,将 jit 放入过滤器字段并禁用 TraceMonkey(列表中的 tracejit)和 JaegerMonkey 中的一个或两个(方法)。如果这样做,您将看到在这个特定的基准测试中,对于每个编译器,三元运算符的速度都快于 Math.min,因此与其他浏览器相比,您看到的反转只是一个不同编译器的使用功能。

现在关于为什么 Math.min 通常比三元运算符慢……首先它必须做更多的工作;如果您仔细测试,它返回的答案与三元运算符不同。其次,它通常作为函数调用实现,这是大部分开销的来源(尽管 TraceMonkey 实际上确实在生成的代码中明确地内联了它,这就是为什么两个代码片段的性能在 TraceMonkey 中没有那么不同)。

关于javascript - 为什么 Firefox 和其他浏览器在计算哪个数字更大时表现相反?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7332444/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com