C# 为什么比特数组比布尔数组快?

C# 为什么比特数组比布尔数组快?,c#,performance,C#,Performance,我在C#中实现了Eratosthenes筛: 公共静态位数组计数() { 常量int halfSize=MaxSize/2; var标记=新的位数组(半尺寸); const int max=半尺寸-2; var maxFactor=(int)Math.Sqrt(MaxSize+1)/2; 对于(var i=1;i>1; 对于(;k),节省的空间可能会影响阵列是否适合CPU缓存(或者至少会大幅改变缓存命中率)。或者您受到内存带宽的限制。对于不同的MaxSize值,您可能会得到不同的结果。根据经验,

我在C#中实现了Eratosthenes筛:

公共静态位数组计数()
{
常量int halfSize=MaxSize/2;
var标记=新的位数组(半尺寸);
const int max=半尺寸-2;
var maxFactor=(int)Math.Sqrt(MaxSize+1)/2;
对于(var i=1;i>1;

对于(;k),节省的空间可能会影响阵列是否适合CPU缓存(或者至少会大幅改变缓存命中率)。或者您受到内存带宽的限制。对于不同的MaxSize值,您可能会得到不同的结果。根据经验,内存越少通常意味着性能越高。因为内存越少也意味着内存分配越少,而内存分配通常越慢。下一个有影响的是缓存。预取、缓存命中和未命中,w这取决于数据结构。如果你还没有配置文件,你应该从配置文件中删除分配的内存,看看是否有差异。使用位,你的状态可以在4字节之内。但是使用布尔值,你的状态需要32*4字节。
GC
kicks in?30+MB将产生差异。测量它!内存不是免费的。BitArray小8倍,适合本测试中的二级缓存。bool[]不适合,三级和RAM访问有害。k+=p使内存访问模式非常不友好,二级至关重要。节省的空间可能会影响是否适合CPU缓存的阵列(或至少大幅改变缓存命中率)。或者您受到内存带宽的限制。对于不同的MaxSize值,您可能会得到不同的结果。根据经验,内存越少通常意味着性能越高。因为内存越少也意味着内存分配越少,而内存分配通常越慢。下一个有影响的是缓存。预取、缓存命中和未命中,w这取决于数据结构。如果你还没有配置文件,你应该从配置文件中删除分配的内存,看看是否有差异。使用位,你的状态可以在4字节之内。但是使用布尔值,你的状态需要32*4字节。
GC
kicks in?30+MB将产生差异。测量它!内存不是免费的。BitArray小8倍,适合本测试中的二级缓存。bool[]不适合,L3和RAM访问有害。k+=p使内存访问模式非常不友好,使二级缓存变得至关重要。
+---------------+----------+---------+---------+----------+----------+----------+-------+-----------+
| Method        | Mean     | Error   | StdDev  | Median   | Min      | Max      | Op/s  | Allocated |
+---------------+----------+---------+---------+----------+----------+----------+-------+-----------+
| SieveBool     | 294.7 ms | 4.00 ms | 3.74 ms | 293.5 ms | 290.8 ms | 304.0 ms | 3.393 | 33.38 MB  |
+---------------+----------+---------+---------+----------+----------+----------+-------+-----------+
| SieveBitArray | 130.2 ms | 1.03 ms | 0.97 ms | 130.3 ms | 128.5 ms | 132.1 ms | 7.680 | 4.17 MB   |
+---------------+----------+---------+---------+----------+----------+----------+-------+-----------+