枚举BitArray会导致大量的装箱/拆箱吗?

时间:2009-07-15 10:42:32

标签: .net performance ienumerable bitarray

System.BitArray仅实现非通用IEnumerable,它返回IEnumerator.Current属性的Object。是否在BitArray上运行foreach - 例如

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

框并取消每个位值?

查看反射器中的bitarray枚举器,看起来它在每次调用MoveNext()时都会使用新的位掩码而不是更聪明的东西。是否有更有效的方法来枚举BitArray,或者替换具有相同存储特性的BitArray? (List< bool> etc使用每个bool一个字节,而不是一个位,所以使用8x的空间)

1 个答案:

答案 0 :(得分:5)

是的,它会引起很多拳击。但是,在大多数情况下,我实际上并不希望这会伤害性能太多。这很烦人,但我怀疑许多真实世界的应用程序花费大量时间装箱/拆箱(或者之后清理箱子,当然这是其他费用)。在你付出任何努力避免它之前,可能值得检查一下。

你可以很容易地在它上面编写自己的迭代器...特别是如果你不关心如果“版本”改变的话。例如:

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

如果你在迭代时更改数组,几乎肯定会发生不好的事情 - 特别是如果你改变了长度!