在C ++ / java / C#等语言中使用按位运算符背后的主要思想之一就是它们非常快。但我听说在javascript中它们非常慢(不可否认,几毫秒可能并不重要)。为什么会这样?
(this question讨论何时使用按位运算符,因此我将此问题的重点更改为性能。)
答案 0 :(得分:18)
这是一个很老的问题,但似乎没有人回答更新版本。
使用J / C ++中不存在的JavaScript所带来的性能提升是从floating point表示(JavaScript如何将其所有数字编译)转换为32位整数以执行位操作和回来。
答案 1 :(得分:14)
没有人再使用十六进制了吗?
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(',') + ')');
答案 2 :(得分:8)
我在JS中使用零位移位来执行快速整数截断:
var i=3.141532;
var iTrunc=i>>0; //3
答案 3 :(得分:8)
你想什么时候使用它们?当您想要按位操作时,您可能希望使用它们。就像你使用布尔运算符进行布尔运算一样,使用数学运算符进行数学运算。
如果您对按位运算符感到满意,那么将它们用于某些应用程序是很自然的。除了过度优化的布尔数组之外,它们可以用于许多目的。当然,这些情况在Javascript编程中并不经常出现,但这并不是运营商不应该可用的原因。
答案 4 :(得分:5)
我发现了一些不错的信息@ http://dreaminginjavascript.wordpress.com/2009/02/09/bitwise-byte-foolish/
显然他们这些天表现得非常好。你为什么要用它们?与其他任何地方相同的原因。
答案 5 :(得分:4)
有一个用JavaScript编写的NES emulator - 它似乎充分利用了按位操作。
答案 6 :(得分:2)
我认为应该由实施者来使运营商高效或低效。例如,没有什么可以阻止JavaScript实现者创建一个JITting VM,它将一个按位操作转换为一个机器指令。所以对于“JavaScript中的按位运算符”,没有什么固有的慢。
答案 7 :(得分:1)
我怀疑在javascript中按位操作特别慢。由于这些操作可以直接映射到CPU操作,这些操作本身非常有效,似乎没有任何按位操作的固有特性会强制它们在javascript中无法缓慢地运行。
编辑2015年12月:我的立场得到了纠正! Javascript在按位操作方面遇到的性能损失来自于需要从float转换为int和back(因为Javascript中的所有数值变量都存储为浮点值)。感谢Chad Schouggins指出这一点
从几个响应中可以看出,javascript存在各种依赖于按位操作的应用程序(例如:密码学和图形学)并且速度不是特别慢......(请参阅本页上的“silky”和“Snarfblam”)。这表明虽然比C / C ++和其他直接将按位操作转换为单个本机CPU指令的语言慢,但按位操作都是缓慢的。
让我们永远不会觉得某些特定原因导致javascript主机的各种实现者以一种极其缓慢的方式实现按位操作的可能性,并且看看这是否重要 ......
虽然javascript已被用于其他目的,此语言在提供用户界面类型的服务时最常见的用途。
顺便说一句,我并不是以任何贬义的方式表达这一点;执行这些智能UI功能,并考虑到对语言施加的各种限制以及对标准的松散遵守,需要 - 并且不断要求有才能的javascript黑客。
关键在于,在UI类型要求的上下文中,对于在处理此类操作时容易暴露javascript的缓慢的任何数量的按位操作的需求是不常见的。因此,对于典型用途,程序员应该使用按位运算,如果这种方法似乎能够很好地与整个程序/数据一起流动,那么它们应该很少关注性能问题。在性能不太可能的情况下通过按位使用产生的瓶颈,人们可以随时重构事物,但最好不要在早期优化中保持清醒。
上面的一个值得注意的例外是在现代浏览器中引入 canvas ,我们可以预期javascript主机需要更原始的图形功能,在某些情况下这样的操作可能需要大量的按位操作(以及健康的数学函数)。这些服务很可能最终会通过javascript库(甚至最终作为语言添加)得到支持。对于这样的图书馆,业界常见的智慧将被用于找出最有效的方法。此外,如果确实存在按位操作的javascript性能方面的弱点,我们会得到一些帮助,因为我预测将修改各种主机(浏览器)上的javascript实现以改进此特定区域。 (这将遵循javascript的典型演变模式,这是我们多年来所见过的。)
答案 8 :(得分:1)
人们用JavaScript做有趣的事情。
例如,其中实施了许多加密算法(出于各种原因);所以当然使用按位运算符。
答案 9 :(得分:1)
在Windows Scripting Host JScript版本中使用JavaScript,您可能有理由使用按位运算符来挑选从WMI或Active Directory调用返回的值中的标志。例如,AD中用户记录的用户访问值包含打包到一个长整数中的几个标志。
ADS_UF_ACCOUNTDISABLE = 0x00000002;
if (uac & ADS_UF_ACCOUNTDISABLE == ADS_UF_ACCOUNTDISABLE) {
// user account has been disabled
}
或者某人的任意表结构可能包含这样的字段,可以通过ADO和JScript访问。
或者您可能希望将某些检索到的数据转换为任何平台上的二进制表示,只是因为:
BinaryData = "L";
BinaryString = BinToStr(BinaryData, ".", "x");
// BinaryString => '.x..xx..'
因此,人们可能希望在JavaScript中进行位操作的原因很多。至于性能,唯一知道的方法是编写并测试它。我怀疑在大多数情况下它是完全可以接受的,并不比这些系统所包含的众多低效率中的任何其他情况差得多。
答案 10 :(得分:0)
当速度至关重要时,您可以将它们用于位屏蔽:http://snook.ca/archives/javascript/storing_values/
此外,如果您需要支持Netscape 4,您可以使用它们来处理Document.captureEvents()。并不是说任何有尊严的公司都会让你为NS4编写JS ......
答案 11 :(得分:0)
许多按位操作都在这里进行基准测试:http://jsperf.com/rounding-numbers-down/3
但是,请随意在jsPerf上创建自己的性能测试用例!