【问题标题】:Does enumerating a BitArray cause lots of boxing/unboxing?枚举 BitArray 会导致大量装箱/拆箱吗?
【发布时间】:2010-11-10 23:14:00
【问题描述】:

System.BitArray 仅实现非泛型 IEnumerable,它为 IEnumerator.Current 属性返回一个对象。是否在 BitArray 上运行 foreach - 例如

foreach (bool b in bitArray)
{
    // ...
}

对每个位值进行装箱和拆箱?

查看反射器中的位数组枚举器,看起来它在每次调用 MoveNext() 时都做了一个新的位掩码,而不是更聪明的东西。有没有更有效的枚举 BitArray 的方法,或者有相同存储特性的 BitArray 的替代品? (List 等每个 bool 使用一个字节,而不是单个位,因此使用 8 倍的空间)

【问题讨论】:

    标签: .net performance ienumerable bitarray


    【解决方案1】:

    是的,它会引起很多拳击。然而,在大多数情况下,我实际上并不认为这会对性能造成太大影响。这很烦人,但我怀疑许多现实世界的应用程序会花费大量时间装箱/拆箱(或事后清理箱子,这当然是另一项成本)。在你努力避免它之前,可能值得检查一下。

    不过,您可以相当轻松地在其上编写自己的迭代器……特别是如果您不关心“版本”更改时是否会中断。例如:

    public static IEnumerable<bool> EnumerateBitArray(BitArray bitArray)
    {
        for (int i=0; i < bitArray.Length; i++)
        {
            yield return bitArray[i];
        }
    }
    

    如果您在迭代时确实更改数组,几乎肯定会发生坏事 - 特别是如果您更改长度!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 2011-02-28
      相关资源
      最近更新 更多