Repository navigation
Expand file tree
/
Copy pathDateSpanBenchmark.cs
More file actions
92 lines (71 loc) · 3.31 KB
/
Copy pathDateSpanBenchmark.cs
File metadata and controls
92 lines (71 loc) · 3.31 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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
using System;
using System.Globalization;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Configs;
namespace Cuemon;
[MemoryDiagnoser]
[GroupBenchmarksBy(BenchmarkLogicalGroupRule.ByCategory)]
public class DateSpanBenchmark
{
private DateTime _now;
private DateTime _shortEnd;
private DateTime _mediumEnd;
private DateTime _longEnd;
private DateSpan _shortSpan;
private DateSpan _mediumSpan;
private DateSpan _longSpan;
private string _shortStartString;
private string _shortEndString;
private string _longStartString;
private string _longEndString;
[GlobalSetup]
public void Setup()
{
_now = DateTime.UtcNow;
_shortEnd = _now.AddHours(36); // ~1.5 days
_mediumEnd = _now.AddMonths(5).AddDays(12).AddHours(3);
_longEnd = _now.AddYears(5).AddMonths(2).AddDays(10).AddHours(4).AddMilliseconds(123);
_shortSpan = new DateSpan(_now, _shortEnd);
_mediumSpan = new DateSpan(_now, _mediumEnd);
_longSpan = new DateSpan(_now, _longEnd);
// ISO sortable ("s") uses invariant culture, matches DateSpan.Parse overloads
_shortStartString = _now.ToString("s", CultureInfo.InvariantCulture);
_shortEndString = _shortEnd.ToString("s", CultureInfo.InvariantCulture);
_longStartString = _now.ToString("s", CultureInfo.InvariantCulture);
_longEndString = _longEnd.ToString("s", CultureInfo.InvariantCulture);
}
// Construction: common scenarios
[Benchmark(Baseline = true, Description = "Ctor (short span)")]
public DateSpan Construct_Short() => new DateSpan(_now, _shortEnd);
[Benchmark(Description = "Ctor (medium span)")]
public DateSpan Construct_Medium() => new DateSpan(_now, _mediumEnd);
[Benchmark(Description = "Ctor (long span)")]
public DateSpan Construct_Long() => new DateSpan(_now, _longEnd);
// Single-argument ctor that uses DateTime.Today as upper bound
[Benchmark(Description = "Ctor (single-date)")]
public DateSpan Construct_SingleDate() => new DateSpan(_now);
// Parsing from string (culture-aware overload)
[Benchmark(Description = "Parse (short)")]
public DateSpan Parse_Short() => DateSpan.Parse(_shortStartString, _shortEndString, CultureInfo.InvariantCulture);
[Benchmark(Description = "Parse (long)")]
public DateSpan Parse_Long() => DateSpan.Parse(_longStartString, _longEndString, CultureInfo.InvariantCulture);
// Common instance operations
[Benchmark(Description = "ToString (short)")]
public string ToString_Short() => _shortSpan.ToString();
[Benchmark(Description = "ToString (long)")]
public string ToString_Long() => _longSpan.ToString();
[Benchmark(Description = "GetWeeks (short)")]
public int GetWeeks_Short() => _shortSpan.GetWeeks();
[Benchmark(Description = "GetWeeks (long)")]
public int GetWeeks_Long() => _longSpan.GetWeeks();
[Benchmark(Description = "GetHashCode")]
public int GetHashCode_Benchmark() => _longSpan.GetHashCode();
[Benchmark(Description = "Equals (value vs same value)")]
public bool Equals_Same() => _longSpan.Equals(new DateSpan(_now, _longEnd));
[Benchmark(Description = "Operator == (same value)")]
public bool OperatorEquality_Same()
{
var other = new DateSpan(_now, _longEnd);
return _longSpan == other;
}
}