为什么立方体比方形更快

sha*_*hal 43 javascript performance

我写了这个:

  var max = 0xffffff * 4;
  var step = 1 / max;
  function cube() {
    var result = 0.;
    for (var x = 0.; x < 1; x += step) {
      result += x * x * x;
    }
    return result;
  }
  function mul() {
    var result = 0.;
    for (var x = 0.; x < 1; x += step) {
      result += x * x;
    }
    return result;
  }
  function go() {
    var r = '';
    r += cube() + ' \n';
    r += mul() + ' \n';
    alert(r);
  }
Run Code Online (Sandbox Code Playgroud)

并在Chrome Profiler中查看结果:

mul: 106ms 
cube: 87ms
Run Code Online (Sandbox Code Playgroud)

怎么可能?

Sid*_*dex 34

你的断言是完全错误的.cube不比mul快,你的例子不能证明它.

实际上,发生的事情是Javascript执行的内部比实际的乘法花费更多的时间,导致mul和cube的时间非常相似.我在一个循环中运行了两个函数,只是为了增加差异,而分析器显示20219 vs 20197,这是微不足道的.顺便说一句,立方体在这里是"慢"的.

此外,这种分析方法不起作用,因为Chrome和Firefox在循环中进行数学运算之前都进行了很多优化.您认为循环可能很好地使用缓存值或甚至优化所知的数学函数返回相同的结果.

这是我使用的代码:

<script>
 var max = 0xffffff * 4;
  var step = 1 / max;
  function cube() {
    var result = 0.;
    for (var x = 0.; x < 1; x += step) {
      result += x * x * x;
    }
    return result;
  }
  function mul() {
    var result = 0.;
    for (var x = 0.; x < 1; x += step) {
      result += x * x;
    }
    return result;
  }
  function go() {
    var s='';
    for (var i=0; i<100; i++) {
        s+=cube();
        s+=mul();
    }
    console.log(s);
  }
  go();
</script>
Run Code Online (Sandbox Code Playgroud)

此外,仅作为参考,观看视频:https://fosdem.org/2016/schedule/event/mozilla_benchmarking_javascript_tips/其中一个Firefox家伙解释了为什么microbenchmarking并不是真正意义重大.

  • 也许这可以帮助您完成任务:http://stackoverflow.com/questions/18476402/how-to-disable-v8s-optimizing-compiler(如何禁用V8的优化编译器) (2认同)
  • 我也可以确认@ JamesThorpe的调查结果,立方体在这个基准测试中运行得更快,也适用于我的机器 (2认同)

dmh*_*000 0

也许优化器决定其中一个可以使用向量指令执行,而另一个则使用普通的旧 fmul。我推测“square”使用 fmul,而cube 使用向量指令 mulpd,它可以在一条指令中乘以最多 4 个双精度数。我添加了一个“四元组”,它执行了 4 次乘法,其时间非常接近立方体。但当我转到“五”时,它的速度比方形慢。这是矢量指令用于立方体和四边形的一些间接证据。

看看英特尔 CPU 与平板电脑上的 Arm 的结果会很有趣。