一个落后于像C ++ / JAVA / C#语言使用按位运算符的主要思路是,他们是非常快的。 但我听说在javascript他们非常慢(当然几毫秒可能没有今天多大关系)。 为什么会这样?
( 这个问题的讨论,当使用位运算符,所以我改变了这个问题表现的重点。)
一个落后于像C ++ / JAVA / C#语言使用按位运算符的主要思路是,他们是非常快的。 但我听说在javascript他们非常慢(当然几毫秒可能没有今天多大关系)。 为什么会这样?
( 这个问题的讨论,当使用位运算符,所以我改变了这个问题表现的重点。)
你何时需要使用它们? 你想,当你想要做的位操作使用它们。 就像你会使用布尔运算符做布尔运算,和数学运算符做数学运算。
如果您熟悉位运算符是很自然的将其用于某些应用。 它们可用于除过优化的布尔数组等多种用途。 当然,这种情况下不上来往往在Javascript编程,但是这是没有理由的运营商不应该可用。
这是一个很古老的问题,但似乎没有人回答更新的版本。
对性能的影响,你与不使用C / C存在的JavaScript得到++是自投浮点表示(JavaScript的如何strores其所有的号码),以一个32位整数执行位操作和背部。
没有人使用十六进制了吗?
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(',') + ')');
我用的JS零按位移位来进行快速整数截断:
var i=3.141532;
var iTrunc=i>>0; //3
我发现了一些好消息@ http://dreaminginjavascript.wordpress.com/2009/02/09/bitwise-byte-foolish/
显然,他们表现非常好,这些天。 为什么要使用它们? 同样的原因,你会在其他地方。
有一个NES模拟器 JavaScript编写的-这似乎使大量使用位运算的。
我认为这是由实现,使运营商有效或无效。 例如,没有什么防止一个JavaScript实施者从制造JITting VM,果然逐位运算成1个机器指令。 所以也没什么可说“在JavaScript位运算符” 天生就慢。
人们做有趣的事情在JavaScript中。
例如,有很多在它执行的加密算法(出于各种原因); 所以当然是用来逐位运算符。
在它的Windows脚本宿主的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。 至于性能,要知道唯一的办法就是把它写并对其进行测试。 我怀疑在大多数情况下,这将是完全可以接受的,不显著比其他的低效率,这些系统包含的大量的恶化。
我怀疑位运算是在JavaScript特别慢。 由于这种操作可以直接映射到CPU的操作,其本身相当有效率, 有没有出现是位运算,这将迫使他们在JavaScript的无可挽回地缓慢的固有特征 。
编辑2015年12月 :我认错! 对性能的影响是一个和Javascript的问候容受位运算来源于需要从浮点数转换成int和背面(如Javascript中所有的数值变量存储为浮点值)。 谢谢乍得Schouggins指出了这一点。
从来没有少,在几个答复表明,存在依赖于位运算的JavaScript的各种应用(例如:crytography和图形),哪些不是特别慢......(见柔滑Snarfblam此页)。 这表明,虽然比C / C ++,并直接按位OPS转化为单独的本地CPU指令其他语言慢,位运算是所有的低迷。
我们从来不招待的可能性,一些特殊原因造成的JavaScript的主机来实现的方式,使这些极其缓慢按位老年退休金计划的各种实施者,看看这甚至事项 ...
虽然JavaScript已被用于其他目的, 在提供服务的用户接口类型最常见的使用这种语言 。
顺便说一句,我没有在任何一切贬义的方式这个意思, 执行这些智能UI功能,并考虑强加于语言的各种限制,也是松散坚持标准,已要求 - 和保持requiring-才华的JavaScript的黑客。
问题的关键是,在UI型需求的背景下,需要对位操作容易暴露的JavaScript的缓慢处理这类操作的任何数量是罕见的最好的。 因此,对于典型用途, 程序员应该使用按位操作,其中,如果这种做法似乎与整体的程序/数据流好,他们应该与性能问题的关注很少这样做。 在从按位使用中出现性能瓶颈的可能性不大的情况下,人们总是可以重构的东西,但一个是最好呆在明确从早期的优化。
值得注意的例外以上是引进的帆布 ,在现代浏览器,我们可以预期,更原始的图形功能,将需要的JavaScript的主机,而且这种操作可以在某些情况下需要重剂量的位操作(以及健康做的数学函数)。 很可能,这些服务将最终由JavaScript库(甚至最终达到的语言增加)的方式予以支持。 对于这样的图书馆行业的共同智慧将已经投入使用,以找出最有效的方法。 此外, 如果确实存在按位OPS JavaScript性能的一个弱点,我们会得到一些帮助,我预测,在不同的主机(浏览器)的JavaScript实现将进行修改,以提高这一特定领域。 (这将遵循JavaScript的演化的典型模式,我们已经看到在过去几年。)
当速度是最重要的,你可以将它们用于位掩码: http://snook.ca/archives/javascript/storing_values/
另外,如果你需要支持Netscape 4,你会用它们来对付Document.captureEvents()。 这不是说,尊敬的公司将拥有你写JS的NS4 ...
很多位操作正在这里基准: http://jsperf.com/rounding-numbers-down/3
然而,随意创建jsPerf您自己的性能测试用例!