【问题标题】:Are there any performance costs associated with using bitwise operators?使用按位运算符是否有任何性能成本?
【发布时间】:2015-12-06 18:29:13
【问题描述】:

为了减少 Ajax 请求从我的服务器检索的数据量,我计划将大约 30 个布尔字段转换为一个二进制数,然后使用按位运算符来利用这些数据。

我以前没有使用过位运算符,我想知道它们在 PHP 和 JavaScript 中是快还是慢,即构建一个二进制数然后使用位运算符将其与另一个进行比较与仅查找一个存储在数组/对象中的布尔值?

【问题讨论】:

标签: php javascript optimization bitwise-operators


【解决方案1】:

按位运算通常是高级语言中最快的运算。在 PHP 的情况下,它们映射到底层 C,因此无论如何它们都不会导致性能显着下降。

【讨论】:

  • 更正:它们是所有语言中最快的操作。在最低级别的硬件上,它们是唯一的操作;-)
  • 但是在javascript中所有数字都是以浮点数存储的,所以必须将数字转换为整数,按位运算,再转换回浮点数,对性能有一点影响。跨度>
【解决方案2】:

根据 Mozilla 的文档,JavaScript 中的按位运算非常慢,因为在内部,数字被视为浮点值,而不是 int64。所以我认为你应该尽可能避免在你的 JavaScript 中使用它。

在 PHP 中,我不知道也没有看到任何关于此的正式文档。

【讨论】:

    【解决方案3】:

    您可以做到这一点的唯一方法是通过测量 - 尽管我怀疑在 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 可以提高速度,如果要节省空间(带宽),请使用按位打包。

    【讨论】:

    • 感谢您为测试它付出的努力。有趣的是数组稍微快了一点,这可能意味着我的应用程序中会有一个可测量的差异(因为每次我想测试时我都必须从数组中计算整数)
    【解决方案4】:

    当然会有很大的性能成本 - 即您自己的性能成本。

    首先,将 bool 字段更改为位不会优化任何内容。它不会使您的应用程序更快。其次,你说你以前没有使用过按位运算,所以你会浪费很多时间来学习在 Web 编程中几乎没有用的新东西。第三,您的代码的可读性降低了几个数量级,这意味着在不久的将来会产生重大的支持和重构成本。底线:不要浪费你的时间。

    【讨论】:

    • 我明白你的意思(特别是在代码可读性方面),但从数据飞来飞去的角度来看,它会使应用程序更快/更高效(我至少会节省我认为每个 AJAX 请求需要几个 kB .. 并且有很多 AJAX 请求)。虽然我之前没有使用过位运算符,但原因可能与许多程序员一样:我没有必要,不是因为它们难学。基本运算符(尤其是 &)的行为在我看来非常简单。
    • 该应用程序仅对每个用户操作使用一个请求(重新填充谷歌地图以响应拖动/缩放),虽然我启用了 gzip,但我希望很大一部分用户将访问它手机,所以我必须注意慢速连接。
    • -1 这是最近几天左右最毒的答案之一。浪费时间学习是什么意思? Web 编程中不使用按位运算?好吧,我一直在使用它!因为更容易把这个 SQL 条件“WHERE type & 6 != 0”而不是“WHERE type == 2 OR type == 4”...有乐趣postgresql.org/docs/9.3/static/datatype-binary.html...编辑:stackoverflow.com/questions/1277470/…跨度>
    猜你喜欢
    • 2012-09-27
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 2018-03-11
    • 1970-01-01
    • 2012-07-20
    相关资源
    最近更新 更多