Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 整数强制转换和舍入的性能_Javascript_Performance_Google Chrome_Firefox_Opera - Fatal编程技术网

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
是一个浮点数。我忘记了同样的事情可以用位运算来完成,但经过一点搜索,我发现了两个如此相关的问题:

然而,无论是在那里还是在其他任何地方,我都没有找到关于比较性能的信息。因此,我做了一个快速的jsperf,它以比
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的性能我正在测试闪烁浏览器