为什么Javascript的Math.floor是在Javascript中计算楼层的最慢方式?

z5h*_*z5h 25 javascript optimization

我一般不喜欢微基准测试.但这一个有一个非常有趣的结果.
http://ernestdelgado.com/archive/benchmark-on-the-floor/

它表明这Math.floor是在Javascript中计算楼层的最慢方式.~~n,n|n,n&n全部为快.
这看起来非常令人震惊,因为我希望在今天的现代浏览器中实现Javascript的人会是一些相当聪明的人.

对于其他方法无法做到的事情,地板是否重要?有没有理由使用它?

Mat*_*ley 32

主要原因Math.floor是速度较慢(实际上它是 - 在某些测试中我做得更快)是它涉及函数调用.较旧的JavaScript实现无法内联函数调用.较新的引擎可以内联调用,或者至少使属性查找更快,但是如果您(或其他一些脚本)覆盖了Math.floor函数,它们仍然需要保护条件.虽然开销很小,但速度差别不大.

更重要的是,正如在几条评论中提到的那样,其他方法并不等同.他们都通过按位操作来工作.按位运算符通过截断数字自动将其操作数转换为32位整数.如果数字适合32位,那很好,但JavaScript数字是64位浮点数,可能比2147483647大得多.

它们也为负数给出不同的结果,因为转换为整数截断并且Math.floor总是向下舍入.例如Math.floor(-2.1) === -3,但是(-2.1) | (-2.1) === -2.

如果你知道你只处理小于2147483648的正数,你需要在旧浏览器中挤出你的代码的所有性能(确保它实际上是瓶颈.它可能不是.),我会用一种更简单的方法:x|0.它不会对变量进行两次计算,即使x是表达式也可以工作(只需确保将其放在括号中,这样就不会遇到优先级问题).

  • 我知道这个答案已经有几年了,但V8现在内联函数调用,这导致[`Math.floor`表演以及按位黑客攻击](http://jsperf.com/js-floors). (6认同)

kem*_*002 26

它与现代浏览器无关.它与实施ECMA标准有关.即使有更快的方法,您也不能只改变某个函数的执行方式.它可能会破坏现有代码.

Math.Floor必须考虑处理不同类型的许多不同场景.如你所描述的那样,他们可以通过采取捷径更快地制定不同的情景吗 也许他们可以,但这可能打破了其他场景.仅仅因为表面上的东西看起来很小,并不意味着下面没有冰山.

  • +1慢或不慢,这可能是唯一正确的做法*正确* (7认同)