整数转换和舍入的性能

时间:2014-07-29 06:40:13

标签: javascript performance google-chrome firefox opera

注意:我刚才问过这个问题并没有得到任何答案,但它确实让我创造了一个有趣的小提琴,这是在帖子的最后。如果您有兴趣,请查看评论。简而言之,truncimul是标准的新增内容,可以在适当处理某些类型的值时填补空白,而不必将其转换为0。尝试小提琴,看一下图表,一切都应该清楚。另外,检查性能以了解性能差异。

原帖

tl; dr:是否有理由使用新的Math.trunc,尤其是在追求性能时?这同样适用于Math.ceil吗? (ps:对不起,如果我没有多大意义,整晚都很难,很难想清楚:&#39;()< / em>的

今天早些时候,我正在阅读我可以在Firefox和Chrome中使用的新ES6内容。那是我遇到Math.imul(整数乘法,32位)和Math.trunc(截断数字到整数部分)的时候。 Math.trunc让我感到奇怪的是它会存在,因为同样的截断可以简单地用Math.imul(n, 1)完成,其中n是一个浮点数。我忘记了按位操作可以做同样的事情,但经过一些搜索后我找到了两个相关的SO问题:

然而,无论是在哪里,我都找不到有关比较表现的信息。所以我做了一个快速的jsperf,它比Math.imul(Math.PI, 1)快了约Math.trunc(Math.PI) 50倍。所以我想到了一些事情,因为,如果Math.imul速度快得多,为什么有人会使用Math.trunc以及为什么Math.imul能够完成工作时将其添加到规范中?

在阅读了上述问题之后,我创建了这个fiddle,它构建了一个表,其中包含相关函数的各种输入的所有返回值(包括按位运算)。正如线程中所提到的,它们的行为取决于它们的输入 - 按位操作仅处理数字(显然将所有视为一个数字),而Math函数则不包括{{1关心他们的输入是否是数字。所以,现在我们需要imul 的原因。

我创建了另一个jsperf,它确认了表中显示的内容,trunc表示完全就像按位操作一样。这提出了一个新问题:当我们已经拥有广泛使用的按位运算符时,为什么我们有imul,也是新规范的一部分? jsperf还显示了另一个有趣的事实:Math.imul 不会将其输入视为按位函数它同样快! 0_o

所以我已经离开了,&#34;为什么要Math.floor&#34;到了&#34;为什么要trunc&#34;为什么不通过imul完成所有事情?&#34;。事实上,如果你看看我制作的小提琴并取消注释某些测试功能,你可以模仿floorceiltrunc(如果你没有&# 39;关心floor)。我运行了一个愚蠢的jsperf,表明模仿-0ceil的速度一样快,模仿floortrunc实际上比floor快〜10倍本身。然后我修复了它以检查所有类型的输入,现在看来(在Firefox上)我得到的确切应该是预期的:通过trunc模拟truncceil可以获得相同的性能直接打电话给他们。 然而只有在floor输入NaN时才会获得NaN。如果你关心那些而特别是,如果你知道你的所有数字都是浮点数,你可以获得ceil的性能的很多倍只需执行floorMath.floor(n+1)

最后是jsperf。 Firefox绝对销毁 Chrome这些类型的操作(dat asm.js优化),但结果我不清楚。所以:

  • 首先,我的测试(小提琴和演奏)是否正确?
  • 当您将转换为整数时,是否需要检查非整数输入 是否重要? (因为如果没有,天真的ceil仿真将为负载提供更多性能)
  • 我是否错过了这些功能所具有的任何其他行为,例如trunc是否合理?

在我看来,在转换为整数甚至舍入(如果小心)时,按位运算符更短,更快,更有效。除了代码清晰度之外,有没有什么理由使用Math.trunc之类的内容?

使用来自updated fiddle的polyfill编辑 - here - 也有人使用polyfill更新了jsperf here

0 个答案:

没有答案