Sample: IntroHardwareCounters
This diagnoser is not enabled in explicit way as the other diagnosers.
You need to specify [HardwareCounters]
and we choose the right diagnoser in the runtime.
Source code
using System;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Diagnosers;
namespace BenchmarkDotNet.Samples
{
[HardwareCounters(
HardwareCounter.BranchMispredictions,
HardwareCounter.BranchInstructions)]
public class IntroHardwareCounters
{
private const int N = 32767;
private readonly int[] sorted, unsorted;
public IntroHardwareCounters()
{
var random = new Random(0);
unsorted = new int[N];
sorted = new int[N];
for (int i = 0; i < N; i++)
sorted[i] = unsorted[i] = random.Next(256);
Array.Sort(sorted);
}
private static int Branch(int[] data)
{
int sum = 0;
for (int i = 0; i < N; i++)
if (data[i] >= 128)
sum += data[i];
return sum;
}
private static int Branchless(int[] data)
{
int sum = 0;
for (int i = 0; i < N; i++)
{
int t = (data[i] - 128) >> 31;
sum += ~t & data[i];
}
return sum;
}
[Benchmark]
public int SortedBranch() => Branch(sorted);
[Benchmark]
public int UnsortedBranch() => Branch(unsorted);
[Benchmark]
public int SortedBranchless() => Branchless(sorted);
[Benchmark]
public int UnsortedBranchless() => Branchless(unsorted);
}
}
Output
Method | Mean | Mispredict rate | BranchInstructions/Op | BranchMispredictions/Op |
---|---|---|---|---|
SortedBranch | 21.4539 us | 0,04% | 70121 | 24 |
UnsortedBranch | 136.1139 us | 23,70% | 68788 | 16301 |
SortedBranchless | 28.6705 us | 0,06% | 35711 | 22 |
UnsortedBranchless | 28.9336 us | 0,05% | 35578 | 17 |
Links
- Diagnosers
- The permanent link to this sample: BenchmarkDotNet.Samples.IntroHardwareCounters