Javascript 整数强制转换和舍入的性能
注意:我不久前问过这个问题,但没有得到任何答案,但它确实让我创作了一把有趣的小提琴,就在文章的末尾。如果您感兴趣,请查看评论。简言之,Javascript 整数强制转换和舍入的性能,javascript,performance,google-chrome,firefox,opera,Javascript,Performance,Google Chrome,Firefox,Opera,注意:我不久前问过这个问题,但没有得到任何答案,但它确实让我创作了一把有趣的小提琴,就在文章的末尾。如果您感兴趣,请查看评论。简言之,trunc和imul,这两项标准的新增内容,在正确处理某些类型的值时填补了空白,而不只是将它们转换为0。试试小提琴,看看图表,一切都应该清楚。此外,检查性能以了解性能差异。 原职 tl;dr:是否有理由使用新的Math.trunc,尤其是在追求性能时?这同样适用于Math.ceil?(附言:如果我没有太多意义,整晚都没睡,几乎不能清晰地思考,那么很抱歉:“() 今
trunc
和imul
,这两项标准的新增内容,在正确处理某些类型的值时填补了空白,而不只是将它们转换为0
。试试小提琴,看看图表,一切都应该清楚。此外,检查性能以了解性能差异。
原职
tl;dr:是否有理由使用新的Math.trunc
,尤其是在追求性能时?这同样适用于Math.ceil
?(附言:如果我没有太多意义,整晚都没睡,几乎不能清晰地思考,那么很抱歉:“()
今天早些时候,我正在阅读Firefox和Chrome中可以使用的ES6新功能。当时我遇到了Math.imul
(整数乘法,32位)和Math.trunc
(将数字截断为整数部分).Math.trunc
的存在让我感到奇怪,因为同样的截断可以用Math来完成。imul(n,1)
其中n
是一个浮点数。我忘记了同样的事情可以用位运算来完成,但经过一点搜索,我发现了两个如此相关的问题:
Math.trunc(Math.PI)快50倍的速度将Math.imul(Math.PI,1)
固定化
。所以我觉得有些问题,因为,如果Math.imul
速度快得多,为什么会有人使用Math.trunc
呢?为什么要在Math.imul
可以完成它的工作时将其添加到规范中呢
在阅读了前面提到的问题之后,我创建了一个表,其中包含了相关函数(包括按位操作)的各种输入的所有返回值。正如线程中提到的,它们的行为因其输入而异-按位操作只处理数字(并且很明显地把所有的东西都当作一个数字来对待),而Math
函数,不包括imul
关心它们的输入是否是一个数字。因此,现在我们需要trunc
是有原因的
我制作了另一个jsperf,它证实了表中显示的,imul
的行为与按位操作完全相同。这提出了一个新的问题:既然我们已经有了广泛使用的按位运算符,为什么我们还有Math.imul
,这也是新规范的一部分?jsperf还显示了另一个有趣的事实:Math.floor
不像按位函数那样处理其输入,但它同样快!0\u o
所以我从“为什么有trunc
”到“为什么有imul
”,再到“为什么不通过floor
?”。事实上,如果你看看我做的小提琴并取消注释某些测试函数,你可以通过floor
(如果你不在乎-0
)来模拟ceil
和trunc
).我运行了一个愚蠢的jsperf,它显示通过floor
模拟ceil
同样快,而通过floor
模拟trunc
实际上比trunc
本身快约10倍。然后我修复了它以检查所有类型的输入,现在看起来(在Firefox上)我得到的正是我应该得到的:通过floor
模拟trunc
和ceil
可以提供与直接调用它们相同的性能。然而,只有当NaN
是输入之类的东西时,你才关心得到NaN
。如果你不关心这些,尤其是如果你知道由于您所有的数字都是浮点数,只需执行Math.floor(n+1)
,您就可以在floor
中获得比ceil
好几倍的性能
最后是.Firefox在这类操作(dat asm.js优化)中绝对会破坏Chrome,但结果对我来说并不清楚。因此:
- 首先,我的测试(小提琴和演奏)是否正确
- 当您强制转换为整数时,检查非整数输入的需要是否很重要?(因为如果不是,naive
仿真将赋予加载更高的性能)ceil
- 我是否遗漏了这些函数所具有的任何其他行为,例如,这些行为是否可以证明使用
trunc
Math.trunc
的东西吗
编辑-使用polyfill from--另外,有人用polyfill更新了jsperf,在所有浏览器上,或者在您测试的浏览器上,它的速度都快了50倍?在合成测试或日常情况下,它的速度更快吗?是否所有浏览器都正确支持它?尤其是所有正在使用的浏览器(这意味着即使是几年前的版本)?我可能是错的,但是,你将
Math.trunc
与Math.ceil
进行性能比较,你不应该从这里使用polyfill吗?@JoachimPileborg不,Math.imul
与Math.trunc
进行比较,特别是在Firefox上使用Math.PI
作为输入。我只是在修复了jsperf之后才测试了Chrome。整个~50倍的事情都是我糟糕的性能手工造成的。Opera在几乎所有方面的表现和行为都像Chrome,所以我只在它上面运行了小提琴。这些是我正在测试的ES6功能,但是位运算符,ceil
和floor
应该得到广泛的支持。@WillemD'haeseleer我只是在衡量Firefox的性能我正在测试闪烁浏览器