Skip to content

Commit 035f857

Browse files
Fix time unit conversion in PhdTableView
1 parent 4b14c98 commit 035f857

9 files changed

+109
-2
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
using JetBrains.Annotations;
2+
using Perfolizer.Metrology;
3+
using Perfolizer.Phd.Base;
4+
using Perfolizer.Phd.Dto;
5+
using Perfolizer.Phd.Presenting;
6+
using Perfolizer.Phd.Tables;
7+
using Perfolizer.Presenting;
8+
using Perfolizer.Tests.Infra;
9+
10+
namespace Perfolizer.Tests.Phd;
11+
12+
public class PhdTableTests(ITestOutputHelper output) : PhdTestsBase
13+
{
14+
[Theory]
15+
[MemberData(nameof(EntryDataKeys))]
16+
public Task PhdTableTest(string key)
17+
{
18+
var entry = EntryDataMap[key];
19+
var table = new PhdTable(entry);
20+
var presenter = new StringPresenter();
21+
new PhdMarkdownTablePresenter(presenter).Present(table, new PhdTableStyle());
22+
return VerifyString(key, presenter.Dump());
23+
}
24+
25+
private static readonly IDictionary<string, PhdEntry> EntryDataMap = new Dictionary<string, PhdEntry>
26+
{
27+
{ "case01", Root().Add(Benchmark("Foo", "10ns"), Benchmark("Bar", "200ns")) },
28+
{ "case02", Root().Add(Benchmark("Foo", "10us"), Benchmark("Bar", "200us")) },
29+
{ "case03", Root().Add(Benchmark("Foo", "10ms"), Benchmark("Bar", "200ms")) },
30+
{ "case04", Root().Add(Benchmark("Foo", "10s"), Benchmark("Bar", "200s")) },
31+
{ "case05", Root().Add(Benchmark("Foo", "10ns"), Benchmark("Bar", "1us")) },
32+
{ "case06", Root().Add(Benchmark("Foo", "10ns"), Benchmark("Bar", "1s")) },
33+
};
34+
35+
[UsedImplicitly] public static TheoryData<string> EntryDataKeys = TheoryDataHelper.Create(EntryDataMap.Keys);
36+
37+
private static PhdEntry Root() => new()
38+
{
39+
Meta = new PhdMeta
40+
{
41+
Table = new PhdTableConfig
42+
{
43+
ColumnDefinitions =
44+
[
45+
new PhdColumnDefinition(".benchmark") { Cloud = "secondary" },
46+
new PhdColumnDefinition(".job") { Cloud = "secondary", Compressed = true },
47+
new PhdColumnDefinition("=center")
48+
]
49+
}
50+
},
51+
};
52+
53+
private static PhdEntry Benchmark(string name, params string[] metrics)
54+
{
55+
var entry = new PhdEntry { Benchmark = new CustomBenchmark(name) };
56+
for (int i = 0; i < metrics.Length; i++)
57+
{
58+
var measurement = Measurement.Parse(metrics[i]);
59+
entry.Add(new PhdEntry
60+
{
61+
IterationIndex = i,
62+
Value = measurement.NominalValue,
63+
Unit = measurement.Unit
64+
});
65+
}
66+
return entry;
67+
}
68+
69+
private class CustomBenchmark(string name) : PhdBenchmark
70+
{
71+
public string Name { get; set; } = name;
72+
}
73+
74+
private Task VerifyString(string key, string content)
75+
{
76+
output.WriteLine(content);
77+
var settings = VerifyHelper.CreateSettings("Phd");
78+
settings.UseParameters(key);
79+
return Verify(content, settings);
80+
}
81+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
| Name | Center |
2+
|:-----|---------:|
3+
| Foo | 10.0 ns |
4+
| Bar | 200.0 ns |
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
| Name | Center |
2+
|:-----|---------:|
3+
| Foo | 10.0 μs |
4+
| Bar | 200.0 μs |
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
| Name | Center |
2+
|:-----|---------:|
3+
| Foo | 10.0 ms |
4+
| Bar | 200.0 ms |
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
| Name | Center |
2+
|:-----|--------:|
3+
| Foo | 10.0 s |
4+
| Bar | 200.0 s |
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
| Name | Center |
2+
|:-----|----------:|
3+
| Foo | 10.0 ns |
4+
| Bar | 1000.0 ns |
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
| Name | Center |
2+
|:-----|----------------:|
3+
| Foo | 10.0 ns |
4+
| Bar | 1000000000.0 ns |

src/Perfolizer/Perfolizer/Horology/TimeInterval.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public TimeInterval(double value, TimeUnit unit) : this(value * unit.BaseUnits)
3232
public double ToMinutes() => this / Minute;
3333
public double ToHours() => this / Hour;
3434
public double ToDays() => this / Day;
35+
public double ToUnit(TimeUnit unit) => Nanoseconds / unit.BaseUnits;
3536

3637
public static TimeInterval FromNanoseconds(double value) => Nanosecond * value;
3738
public static TimeInterval FromMicroseconds(double value) => Microsecond * value;

src/Perfolizer/Perfolizer/Phd/Tables/PhdTableView.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public PhdTableView(PhdTable table, PhdTableStyle style)
4545
continue;
4646
var unit = measurements.First().Unit;
4747

48-
if (unit is TimeUnit timeUnit)
48+
if (unit is TimeUnit)
4949
{
5050
double[] values = measurements
5151
.Select(m => m.AsTimeInterval()!.Value.Nanoseconds)
@@ -54,7 +54,8 @@ public PhdTableView(PhdTable table, PhdTableStyle style)
5454
var bestUnit = TimeUnit.GetBestTimeUnit(values);
5555
for (int rowIndex = 0; rowIndex < measurements.Length; rowIndex++)
5656
{
57-
double valueInBestUnit = TimeUnit.Convert(measurements[rowIndex].NominalValue, timeUnit, bestUnit);
57+
var timeInterval = measurements[rowIndex].AsTimeInterval()!.Value;
58+
double valueInBestUnit = timeInterval.ToUnit(bestUnit);
5859
measurements[rowIndex] = valueInBestUnit.WithUnit(bestUnit);
5960
values[rowIndex] = valueInBestUnit;
6061
}

0 commit comments

Comments
 (0)