为了减少Ajax请求从我的服务器检索的数据量,我计划将大约30个布尔字段转换为一个二进制数,然后使用按位运算符来使用这些数据。
之前我没有使用过按位运算符,并且想知道它们是否在PHP和JavaScript中是快/慢的,即如何构建二进制数,然后使用按位运算符执行比较,而不是仅仅查找存储在数组/对象中的布尔值?
答案 0 :(得分:3)
按位操作通常是更高级语言中最快的操作。在PHP的情况下,它们映射到底层C,因此它们不会导致显着的性能下降。
答案 1 :(得分:2)
当然会有很高的性能成本 - 即您自己的表现成本。
首先,将bool字段更改为位不会优化任何内容。它不会使您的应用程序更快。其次,你说你之前没有使用过按位操作,所以你会花很多时间学习新的东西,这在网络编程中几乎没用。第三,您的代码的可读性降低了一个数量级,这意味着在不久的将来会有大量的支持和重构成本。底线:不要浪费你的时间。
答案 2 :(得分:2)
根据Mozilla的文档,JavaScript中的按位操作非常慢,因为内部数字被视为浮点值,而不是int64。所以我认为你应该尽可能避免在你的JavaScript中使用它。
在PHP中,我不知道,也没有看到任何关于此的正式文档。
答案 3 :(得分:1)
你能做到的唯一方法是通过测量 - 虽然我怀疑在JavaScript中进行按位操作会让你在数组/对象上得到很多。
我试试:
var len = 100000;
var bitwise = 0xdeadbeef;
var arrays = [1,1,0,1,1,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,1,1,1,0,1,1,1,0,1,1,1,1];
var start = new Date().getTime();
for (var i = 0; i < len; i++) {
arrays[i % 32]; //Uncomment to test this
//bitwise & (1 << (i % 32)); //Uncomment to test this
}
var end = new Date().getTime();
console.log((end-start)/len +"ms per access");
我得到了(Chrome,Windows 7,Core i7 920,6 GB RAM):
0.0015 ms per access for arrays
0.0016 ms per access for bit shifting.
你做出决定 - 这几乎是微不足道的。如果要节省空间(带宽),请使用Arrays以获得更好的速度,使用按位打包。