注意:我刚才问过这个问题并没有得到任何答案,但它确实让我创造了一个有趣的小提琴,这是在帖子的最后。如果您有兴趣,请查看评论。简而言之,trunc
和imul
是标准的新增内容,可以在适当处理某些类型的值时填补空白,而不必将其转换为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;。事实上,如果你看看我制作的小提琴并取消注释某些测试功能,你可以模仿floor
和ceil
到trunc
(如果你没有&# 39;关心floor
)。我运行了一个愚蠢的jsperf,表明模仿-0
到ceil
的速度一样快,模仿floor
到trunc
实际上比floor
快〜10倍本身。然后我修复了它以检查所有类型的输入,现在看来(在Firefox上)我得到的确切应该是预期的:通过trunc
模拟trunc
和ceil
可以获得相同的性能直接打电话给他们。 然而只有在floor
输入NaN
时才会获得NaN
。如果你不关心那些而特别是,如果你知道你的所有数字都是浮点数,你可以获得ceil
的性能的很多倍只需执行floor
即Math.floor(n+1)
。
最后是jsperf。 Firefox绝对销毁 Chrome这些类型的操作(dat asm.js优化),但结果我不清楚。所以:
ceil
仿真将为负载提供更多性能)trunc
是否合理?在我看来,在转换为整数甚至舍入(如果小心)时,按位运算符更短,更快,更有效。除了代码清晰度之外,有没有什么理由使用Math.trunc
之类的内容?
使用来自updated fiddle的polyfill编辑 - here - 也有人使用polyfill更新了jsperf here