【问题标题】:Bitarray VS bool[]位数组 VS 布尔 []
【发布时间】:2016-02-03 16:04:24
【问题描述】:

我希望在这里找到一个关于此的现有问题,但我没有。

当您可以将bool 值存储在bool[] 中时,使用Bitarray 有什么优势?

System.Collections.BitArray biArray = new System.Collections.BitArray(8);
biArray[4] = true;

bool[] boArray = new bool[8];
boArray[4] = true;

bool[] 对我来说似乎更方便一些,因为存在更多(扩展)方法来处理数组而不是 BitArray

【问题讨论】:

标签: c# boolean bitarray


【解决方案1】:

存在内存/性能权衡。 BitArray 每个字节将存储 8 个条目,但访问单个条目需要一系列逻辑操作。 bool 数组会将每个条目存储为一个字节,因此占用更多内存,但需要更少的 CPU 周期来访问。

本质上,BitArray 是对 bool[] 的内存优化,但除非内存稀疏,否则使用它是没有意义的。

编辑: 创建了一个简单的性能测试。 在我的机器上使用 BitArray 反转 500M 元素需要 6 秒:

const int limit = 500000000;
var bitarray = new BitArray(limit);
for (var i = 0; i < limit; ++i)
{
    bitarray[i] = !bitarray[i];
}

使用 bool 数组的相同测试大约需要 1.5 秒:

const int limit = 500000000;
var boolarray = new bool[limit];
for (var i = 0; i < limit; ++i)
{
    boolarray[i] = !boolarray[i];
}

【讨论】:

  • 你真的认为做一个掩码和比较比做另一个间接更便宜吗?如果使用bool[] 访问的数组部分当前不在 CPU 缓存中怎么办?
  • 好点,乔恩。缓存未命中代价高昂,这意味着在访问彼此靠近的元素时 BitArray 会表现得更好。
  • 这是与BitVector32 完全不同的测试,测试完全无法比拟的功能。带有BitArray 的那个同时在一个毫无意义的循环上浪费时间,当我将该循环修复为更现实的方法时,只需调用bitarray.Not() 我得到大约 0.05 秒,而 bool 数组为 0.8 秒(它没有.Not() 方法,所以仍然需要循环)。
  • 是的,但是随机访问并不总是一个人在做的事情,所以说权衡只是内存与时间的权衡是不正确的。 BitArray 通常更快,因为它处理 .Not.And 等的速度比布尔数组快得多。
  • (另外,真正的随机访问不同于顺序访问)。
【解决方案2】:

BitArray 是紧凑的,允许您执行按位运算。来自MSDN forum

BitArray 对每个值使用一位,而 bool[] 使用一个字节 对于每个值。您可以传递给 BitArray 构造函数 布尔数组、字节数组或整数数组。你可以 还传递一个整数值指定所需的长度和 (可选)一个布尔参数,指定各个位是否 是否应该设置。

【讨论】:

    猜你喜欢
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 2014-09-23
    • 1970-01-01
    相关资源
    最近更新 更多