【问题标题】:BitArray high performance Or & And & XorBitArray 高性能 Or & And & Xor
【发布时间】:2015-05-09 03:45:38
【问题描述】:

以下是使用示例:

bitarray = bitarray.And(mask);

问题是它与int[] 上的相同操作相比效率如何,复制到同一个数组但不创建另一个数组并返回它(花费时间和创建无用的垃圾) 我已经知道什么 BitArray 类型具有私有非公共成员 m_array,它只是 int[]。 是否有某种方法可以在不创建新实例的情况下进行此操作?比如这样:

bitarray.And(mask);

而且更简单,我想把这个操作加紧

bitarray |= mask;

如果不创建 BitArray 的新实例,我会知道内部的实例 bitarray 发生了什么变化。

我知道,我可以通过反射来做到这一点,但我认为不会更快...... 或者有什么比创建我自己的BitArray 更好的方法吗?

【问题讨论】:

    标签: c# bitarray


    【解决方案1】:

    与您自己的 int[] 实现相比效率如何?编写测试并找出答案。

    BitArray 不是不可变的,它不会创建副本。它只是返回相同的实例。在我看来,您自己的实现不会真正击败它。

    查看位数组:http://referencesource.microsoft.com/#mscorlib/system/collections/bitarray.cs,0a9d097e057af932,references

    【讨论】:

    • 哦,我不知道。此操作返回相同的实例...虽然有点奇怪....目的是什么?
    • @eocron:该模式被称为“流畅接口”,这意味着它允许您链接调用,因此您可以拥有 .And(mymask).Or(otherMask).Xor(thirdMask);这很方便。第二个原因很可能是性能问题:如果每次都创建新的 BitArray,那就太慢了。
    【解决方案2】:

    是否有一些方法可以在不创建新实例的情况下进行此操作?

    BitArray.And() 方法不会返回 BitArray 的新实例。它只返回“当前”实例(即您调用该方法时使用的实例)。

    如果不创建 BitArray 的新实例,我会知道内部的实例 bitarray 发生了什么变化

    在我看来,最直接的实现方法是简单地编写一个循环,将bitarray 对象中的位值与mask 对象中的位值进行比较之前 你应用And() 方法。

    请注意,要对这些信息做任何有趣的事情,您可能需要将其保存在某个数据结构中的某个地方。坦率地说,我认为避免为此目的创建一个新的BitArray 对象并没有多大优势。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-13
      • 2013-10-12
      • 1970-01-01
      • 2017-06-01
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      相关资源
      最近更新 更多