Bitarray VS bool []

Byy*_*yyo 11 c# boolean bitarray

我期待在这里找到一个关于这个的现有问题,但我没有.

Bitarray当你可以将bool值存储在一个时,使用a有什么好处bool[]

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

bool[] boArray = new bool[8];
boArray[4] = true;
Run Code Online (Sandbox Code Playgroud)

bool[],因为存在更多的(扩展)方法以数组,而不是一个工作似乎有点更加得心应手给我BitArray

Kva*_*vam 12

有记忆/性能权衡.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];
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这是一个完全不同的‘BitVector32’测试,测试一个完全无与伦比的功能。带有“BitArray”的同时在无意义的循环上浪费时间,当我将该循环修复为仅调用“bitarray.Not()”的更现实的方法时,我得到大约 0.05 秒,而 bool 数组为 0.8 秒(没有 `.Not()` 方法,所以仍然需要循环)。 (3认同)
  • 您是否真的认为进行屏蔽比较会比进行另一个间接调用便宜?如果用`bool []`访问的数组部分当前不在CPU缓存中怎么办? (2认同)

Rah*_*thi 6

BitArray是紧凑的,允许您执行按位操作.来自MSDN论坛:

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