为什么立方体比方块更快
我写了这个:
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); }
并在Chrome探查器中查看结果:
mul: 106ms cube: 87ms
这怎么可能?
你的说法显然是错误的。 立方体不比mul快,你的例子不能certificate它。
实际上,发生的事情是,JavaScript执行的内部比实际的乘法需要更多的时间,导致多方和多方的时间非常相似。 我在一个循环中运行了这两个函数,只是为了增加差异,剖析器显示20219与20197,这是微不足道的。 顺便说一句,立方体在这里是“慢”的一个。
此外,这种分析方法不起作用,因为Chrome和Firefox在循环内部进行math运算之前都进行了大量优化。 你认为循环可能很好地使用caching值,甚至是优化知道的math函数都会返回相同的结果。
这是我使用的代码:
<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>
另外,仅供参考,请观看video: https : //fosdem.org/2016/schedule/event/mozilla_benchmarking_javascript_tips/其中一个Firefox的家伙解释为什么microbenchmarking没有多大意义。
这可能是因为,因为所有的数字都低于1,所以立方体函数比平方数加上更小的数字,(我不确定这是否实际上是如何工作的),因此花费更less的时间。 这只是一个猜测。 而且由于数字太小,这也可能是由于精度不够。 另外我用数字testing一个立方体与他们较慢。
也许优化器决定其中一个可以执行vector指令,而另一个使用普通的旧fmul。 我推测'square'使用fmul和cube使用向量指令mulpd,它可以在一条指令中增加4倍。 我添加了一个“四”,它做了4倍,其时间非常接近立方体。 但是当我去“五”的时候,它比方块慢了一点。 这是一些间接的证据,说明vector指令正在用于立方体和四边形。
在平板电脑上看到英特尔CPU与arm的结果会很有趣。
在某些浏览器上,JavaScript以解释开始,而JIT在后台编译。 一旦javascript被编译,它开始运行得更快。