javascript中按位运算符的性能

Gor*_*son 19 javascript bitwise-operators

在C++/java/C#等语言中使用按位运算符的主要思想之一就是它们非常快.但我听说在javascript中它们非常慢(不可否认,几毫秒可能并不重要).为什么会这样?

(这个问题讨论了何时使用按位运算符,所以我将这个问题的重点改为性能.)

Cha*_*ins 18

这是一个相当古老的问题,但似乎没有人回答更新版本.

使用C/C++中不存在的JavaScript获得的性能损失是从浮点表示(JavaScript如何将其所有数字编译)转换为32位整数以执行位操作和返回.

  • 考虑到大多数JS JIT完全可以保持一个数字只是一个int,如果没有做任何保证浮点运算的话,那就不再那么真了.虽然规范要求转换,但只要最终结果相同,这并不是实际实现必须如何工作的. (3认同)
  • 有效点,但这仍然适用于问题. (3认同)

ken*_*bec 15

没有人再使用十六进制了吗?

function hextoRgb(c) {
    c = '0x' + c.substring(1);
    return [(c >> 16) & 255, (c >> 8) & 255, c & 255]; 
}

var c1 = hextoRgb('#191970');
alert('rgb(' + c1.join(',') + ')');
Run Code Online (Sandbox Code Playgroud)

  • 实际上换弦对我来说有点奇怪.但另一方面它比`return /#([0-9a-f] {2})([0-9a-f] {2})([0-9a-f] {2}更容易阅读/i.exec(c).slice(1).map(function(e) {return parseInt(e,16);});`例如. (2认同)

spe*_*der 8

我在JS中使用零位移零来执行快速整数截断:

var i=3.141532;
var iTrunc=i>>0; //3
Run Code Online (Sandbox Code Playgroud)

  • 这是对位移算子的真正令人厌恶的用法. (21认同)
  • +1编程是为了确保程序员和计算机能够理解你的所作所为,如果满足这些条件,习语是完全合适的.所有语言都有它们,甚至是英语.成语最初可能不熟悉,但只要它们(1)令人难忘并且(2)可识别,它们完全适合程序员的词典. (15认同)
  • var iTrunc = i | 0; 为您节省一击高尔夫(在这里看到一些代码 - 高尔夫线程) (8认同)
  • 是的,它很肮脏,我知道,但实际上,它在Flash的游戏编程中占有一席之地.在AVM1天,这是最快的方式.不知道这是否适用于JS. (4认同)
  • 我认为你需要认识到这是游戏编程,这种事情既常见又是必需的。不过,拥有解释项目性能策略的优秀文档是个好主意。您应该会看到一些最小化 JVM 中的垃圾收集所需的环。 (2认同)

Kip*_*Kip 8

你什么时候想用它们?当您想要按位操作时,您可能希望使用它们.就像你使用布尔运算符来做布尔运算一样,使用数学运算符来进行数学运算.

如果您对按位运算符感到满意,那么将它们用于某些应用程序是很自然的.除了过度优化的布尔数组之外,它们可以用于许多目的.当然,这些情况在Javascript编程中并不经常出现,但这并不是运营商不应该可用的原因.


sna*_*arf 5

我发现了一些很好的信息@ http://dreaminginjavascript.wordpress.com/2009/02/09/bitwise-byte-foolish/

显然,这些天他们表现得非常好.你为什么要用它们?与其他任何地方相同的原因.