【问题标题】:Efficiency of bitwise operation in JavascriptJavascript中按位运算的效率
【发布时间】:2015-02-01 05:19:44
【问题描述】:

根据w3schools

与许多其他编程语言不同,JavaScript 没有定义不同类型的数字,如整数、短整数、长整数、浮点数等。

JavaScript 数字始终按照国际 IEEE 754 标准存储为双精度浮点数。

所以我的问题来了:如果我们要执行按位运算,javascript 如何将 64 位 IEEE 754 标准浮点数转换为普通的 32 位整数,效率如何?从直觉上看,转换数字会很昂贵,那么使用位移是否仍然比乘以 2n 更有效?

非常感谢!

【问题讨论】:

  • 每个实现都可能不同,因此可能无法说出最有效的方法是什么。此外,如果您打算经常这样做,您实际上可以使用类型化数组。 W3Schools 并不完全正确……有些类型的数组可能对按位更有效,但您必须进行测试才能确定。 developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures
  • 如果您想“了解”一种操作相对于另一种操作的效率,那么您必须测试和测量性能,并且必须在您认为相关的任何浏览器和浏览器版本中对其进行表征。 jsperf.com 是运行此类测试的好工具。每个浏览器都有自己的实现,因此没有理论上的答案。测量,测量,测量。
  • 您是否发现简单的乘法表现不佳?最易读且因此可维护的代码是不使用移位进行乘法运算的代码。

标签: javascript performance bit-manipulation


【解决方案1】:

来自好的部分

位运算符适用于整数。 JavaScript 没有 有整数。它只有双精度浮点数。 因此,按位运算符将其数字操作数转换为整数, 做他们的生意,然后把他们转换回来。在大多数语言中, 这些算子非常接近硬件,而且速度非常快。在 JavaScript,它们离硬件很远而且很慢。

但最终,行为几乎总是特定于实现的。某些 JavaScript 环境(现在或将来)可能会推断出这段或那段代码将始终像 int 一样处理,或者默认情况下将 var 存储为 int。

确定的唯一方法是分析您的代码。像 JSPerf 这样的工具可能会有所帮助。它还可能为您提供相互矛盾的指标 - 在一个浏览器中运行得更快的内容可能在另一个 JavaScript 引擎中表现不佳。性能提升也可能取决于您自己的生产代码在不知不觉中中断的启发式方法。

不过,真正的问题是另一个问题:您打算怎么做才能使乘法性能成为性能的关键因素?因为这可能不是您应该在阻止 UI 的客户端脚本中执行的操作。

【讨论】:

  • ic,这澄清了我的疑虑。谢谢:D
  • 使用位运算符的一个原因是为国际象棋、四连线等实现位板。因此,确实有合法的用例。
猜你喜欢
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多