Repository navigation
Expand file tree
/
Copy pathMidpointBench.cs
More file actions
58 lines (49 loc) · 1.78 KB
/
Copy pathMidpointBench.cs
File metadata and controls
58 lines (49 loc) · 1.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
using BenchmarkDotNet.Attributes;
using OverflowProof.Types;
namespace OverflowProof.Benchmarks;
/// <summary>
/// Раздел 2. Три способа взять середину отрезка. В исходниках .NET
/// встречаются два разных, и рядом с одним из них стоит комментарий,
/// что он экономит одно вычитание на итерации. Замер проверяет, видно ли
/// эту экономию.
/// </summary>
public class MidpointBench
{
private (int Low, int High)[] _ranges = [];
/// <summary>Границы готовятся один раз.</summary>
[GlobalSetup]
public void Setup() => _ranges = Payloads.Ranges;
/// <summary>Привычная запись. Переполняется на больших границах.</summary>
[Benchmark(Baseline = true)]
public int Naive()
{
int total = 0;
for (int i = 0; i < _ranges.Length; i++)
{
total += Subjects.MidNaive(_ranges[i].Low, _ranges[i].High);
}
return total;
}
/// <summary>Через разность, как в ArraySortHelper.</summary>
[Benchmark]
public int Subtract()
{
int total = 0;
for (int i = 0; i < _ranges.Length; i++)
{
total += Subjects.MidSubtract(_ranges[i].Low, _ranges[i].High);
}
return total;
}
/// <summary>Через беззнаковое сложение, как в SpanHelpers.</summary>
[Benchmark]
public int Unsigned()
{
int total = 0;
for (int i = 0; i < _ranges.Length; i++)
{
total += Subjects.MidUnsigned(_ranges[i].Low, _ranges[i].High);
}
return total;
}
}