public class CountTruesBenchmarks { private readonly bool[] boolArray; public CountTruesBenchmarks() { var rnd = new Random(42); boolArray = Enumerable.Range(0, 500).Select(_ => rnd.NextBoolean()).ToArray(); } [Benchmark] public int CountTruesFor() { var count = 0; for (int i = 0; i < boolArray.Length; i++) { if (boolArray[i]) { count++; } } return count; } [Benchmark] public int CountTruesForEach() { var count = 0; foreach (var b in boolArray) { if (b) { count++; } } return count; } [Benchmark] public int CountTruesLinq() { return boolArray.Count(b => b); } [Benchmark] public unsafe int CountTruesAvx2() { var count = 0; if (Avx2.IsSupported) { var maxBatchIndex = boolArray.Length - boolArray.Length % Vector256.Count; if (maxBatchIndex > 0) { var zerosVector = Vector256.Zero; fixed (bool* boolArrayPtr = boolArray) { var boolArrayBytePtr = (byte*) boolArrayPtr; for (int i = 0; i < maxBatchIndex; i += Vector256.Count) { var batchVector = Avx.LoadVector256(boolArrayBytePtr + i); var comparisonResult = Avx2.CompareEqual(batchVector, zerosVector); var nonZeroMask = ~(uint) Avx2.MoveMask(comparisonResult); var nonZeroCount = Popcnt.PopCount(nonZeroMask); count += (int) nonZeroCount; } } } if (maxBatchIndex < boolArray.Length) { for (int i = maxBatchIndex; i < boolArray.Length; i++) { if (boolArray[i]) { count++; } } } } else { for (int i = 0; i < boolArray.Length; i++) { if (boolArray[i]) { count++; } } } return count; } }