位数组 VS 布尔[]
Bitarray VS bool[]
我希望在 SO 上找到关于此的现有问题,但我没有。
当您可以将 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
BitArray 结构紧凑,允许您执行按位运算。来自 MSDN forum :
A BitArray uses one bit for each value, while a bool[] uses one byte
for each value. You can pass to the BitArray constructor either an
array of bools, an array of bytes or an array of integers. You can
also pass an integer value specifying the desired length and
(optionally) a boolean argument that specifies if the individual bits
should be set or not.
有一个 memory/performance 权衡。 BitArray 每个字节将存储 8 个条目,但访问单个条目需要在后台进行一系列逻辑操作。布尔数组将每个条目存储为一个字节,因此占用更多内存,但需要更少的 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];
}
我希望在 SO 上找到关于此的现有问题,但我没有。
当您可以将 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
BitArray 结构紧凑,允许您执行按位运算。来自 MSDN forum :
A BitArray uses one bit for each value, while a bool[] uses one byte for each value. You can pass to the BitArray constructor either an array of bools, an array of bytes or an array of integers. You can also pass an integer value specifying the desired length and (optionally) a boolean argument that specifies if the individual bits should be set or not.
有一个 memory/performance 权衡。 BitArray 每个字节将存储 8 个条目,但访问单个条目需要在后台进行一系列逻辑操作。布尔数组将每个条目存储为一个字节,因此占用更多内存,但需要更少的 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];
}