Skip to content

Commit 8ec00dd

Browse files
Hiding columns (#1890)
* Move literals into a class; In future it will be used for cli code completion; StatisticalTest/HardwareCounters/CiLower are missing * Add HideColumns * Do not start printing a table when no columns, Replace it with the message * Show legends only for visible columns i.e. hide the time legend when Mean&Error are hidden * Replace AllocRatio ctor creation to the static field, like BaselineRatioColumn.RatioMean * Encapsulate tight logic in SummaryTableColumn * Add CLI support * Print common columns when all columns are hidden * solve warnings and errors * improvements: - don't store Names in the field when there is no need to - make it possible to apply `[HideColumnsAttribute]` to entire assembly - add comment explaining why Column class is public - make two existing column hiding rules public so they can be reused - Column.IsCommon is better name than Column.IsCommonColumn - simplify LINQ -add sample Co-authored-by: Adam Sitnik <[email protected]>
1 parent 8380003 commit 8ec00dd

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+375
-70
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using BenchmarkDotNet.Attributes;
2+
using BenchmarkDotNet.Columns;
3+
4+
namespace BenchmarkDotNet.Samples
5+
{
6+
[MemoryDiagnoser] // adds Gen0, Gen1, Gen2 and Allocated Bytes columns
7+
[HideColumns(Column.Gen0, Column.Gen1, Column.Gen2)] // dont display GenX columns
8+
public class IntroHidingColumns
9+
{
10+
[Benchmark]
11+
public byte[] AllocateArray() => new byte[100_000];
12+
}
13+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using BenchmarkDotNet.Extensions;
4+
using BenchmarkDotNet.Reports;
5+
6+
namespace BenchmarkDotNet.Analysers
7+
{
8+
public class HideColumnsAnalyser : AnalyserBase
9+
{
10+
public static readonly IAnalyser Default = new HideColumnsAnalyser();
11+
12+
public override string Id => nameof(HideColumnsAnalyser);
13+
14+
protected override IEnumerable<Conclusion> AnalyseSummary(Summary summary)
15+
{
16+
var hiddenColumns = summary.GetTable(summary.Style).Columns.Where(c => c.WasHidden).ToArray();
17+
18+
if (hiddenColumns.IsEmpty())
19+
yield break;
20+
21+
var columnNames = string.Join(", ", hiddenColumns.Select(c => c.OriginalColumn.ColumnName));
22+
23+
var message = $"Hidden columns: {columnNames}";
24+
yield return Conclusion.CreateHint(Id, message);
25+
}
26+
}
27+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using System;
2+
using BenchmarkDotNet.Configs;
3+
using JetBrains.Annotations;
4+
5+
namespace BenchmarkDotNet.Attributes
6+
{
7+
[PublicAPI]
8+
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = true)]
9+
public class HideColumnsAttribute : Attribute, IConfigSource
10+
{
11+
public IConfig Config { get; }
12+
13+
// CLS-Compliant Code requires a constructor without an array in the argument list
14+
protected HideColumnsAttribute() => Config = ManualConfig.CreateEmpty();
15+
16+
public HideColumnsAttribute(params string[] names) => Config = ManualConfig.CreateEmpty().HideColumns(names);
17+
}
18+
}

src/BenchmarkDotNet/Columns/BaselineAllocationRatioColumn.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@ namespace BenchmarkDotNet.Columns
1212
public class BaselineAllocationRatioColumn : BaselineCustomColumn
1313
{
1414
public override string Id => nameof(BaselineAllocationRatioColumn);
15-
public override string ColumnName => "Alloc Ratio";
15+
16+
public override string ColumnName => Column.AllocRatio;
17+
18+
public static readonly IColumn RatioMean = new BaselineAllocationRatioColumn();
19+
20+
private BaselineAllocationRatioColumn() { }
1621

1722
public override string GetValue(Summary summary, BenchmarkCase benchmarkCase, Statistics baseline, IReadOnlyDictionary<string, Metric> baselineMetrics,
1823
Statistics current, IReadOnlyDictionary<string, Metric> currentMetrics, bool isBaseline)

src/BenchmarkDotNet/Columns/BaselineColumn.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public class BaselineColumn : IColumn
99
[PublicAPI] public static readonly IColumn Default = new BaselineColumn();
1010

1111
public string Id => nameof(BaselineColumn);
12-
public string ColumnName => "Baseline";
12+
public string ColumnName => Column.Baseline;
1313

1414
public string GetValue(Summary summary, BenchmarkCase benchmarkCase) => summary.IsBaseline(benchmarkCase) ? "Yes" : "No";
1515
public string GetValue(Summary summary, BenchmarkCase benchmarkCase, SummaryStyle style) => GetValue(summary, benchmarkCase);

src/BenchmarkDotNet/Columns/BaselineRatioColumn.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ public override string ColumnName
3535
switch (Metric)
3636
{
3737
case RatioMetric.Mean:
38-
return "Ratio";
38+
return Column.Ratio;
3939
case RatioMetric.StdDev:
40-
return "RatioSD";
40+
return Column.RatioSD;
4141
default:
4242
throw new NotSupportedException();
4343
}

src/BenchmarkDotNet/Columns/CategoriesColumn.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public class CategoriesColumn : IColumn
1010
public static readonly IColumn Default = new CategoriesColumn();
1111

1212
public string Id => nameof(CategoriesColumn);
13-
public string ColumnName => "Categories";
13+
public string ColumnName => Column.Categories;
1414
public string GetValue(Summary summary, BenchmarkCase benchmarkCase) => string.Join(",", benchmarkCase.Descriptor.Categories);
1515
public string GetValue(Summary summary, BenchmarkCase benchmarkCase, SummaryStyle style) => GetValue(summary, benchmarkCase);
1616
public bool IsDefault(Summary summary, BenchmarkCase benchmarkCase) => false;

src/BenchmarkDotNet/Columns/Column.cs

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
using JetBrains.Annotations;
2+
3+
namespace BenchmarkDotNet.Columns
4+
{
5+
// ReSharper disable once InconsistentNaming
6+
[PublicAPI] // this type is public, so the users can do things like [HideColumns(Column.$)] and get suggestions from IDE
7+
public static class Column
8+
{
9+
public const string Namespace = "Namespace";
10+
public const string Type = "Type";
11+
public const string Method = "Method";
12+
13+
public const string Job = "Job";
14+
15+
public const string Mean = "Mean";
16+
public const string StdErr = "StdErr";
17+
public const string StdDev = "StdDev";
18+
public const string Error = "Error";
19+
public const string OperationPerSecond = "Op/s";
20+
public const string Min = "Min";
21+
public const string Q1 = "Q1";
22+
public const string Median = "Median";
23+
public const string Q3 = "Q3";
24+
public const string Max = "Max";
25+
public const string Skewness = "Skewness";
26+
public const string Kurtosis = "Kurtosis";
27+
public const string MValue = "MValue";
28+
public const string Iterations = "Iterations";
29+
30+
public const string P0 = "P0";
31+
public const string P25 = "P25";
32+
public const string P50 = "P50";
33+
public const string P67 = "P67";
34+
public const string P80 = "P80";
35+
public const string P85 = "P85";
36+
public const string P90 = "P90";
37+
public const string P95 = "P95";
38+
public const string P100 = "P100";
39+
40+
public const string Categories = "Categories";
41+
public const string LogicalGroup = "LogicalGroup";
42+
public const string Rank = "Rank";
43+
44+
public const string Ratio = "Ratio";
45+
public const string RatioSD = "RatioSD";
46+
public const string AllocRatio = "Alloc Ratio";
47+
48+
public const string Allocated = "Allocated";
49+
public const string Gen0 = "Gen0";
50+
public const string Gen1 = "Gen1";
51+
public const string Gen2 = "Gen2";
52+
53+
public const string AllocatedNativeMemory = "Allocated native memory";
54+
public const string NativeMemoryLeak = "Native memory leak";
55+
public const string CompletedWorkItems = "Completed Work Items";
56+
public const string LockContentions = "Lock Contentions";
57+
public const string CodeSize = "Code Size";
58+
59+
//Characteristics:
60+
public const string Id = "Id";
61+
62+
public const string MaxRelativeError = "MaxRelativeError";
63+
public const string MaxAbsoluteError = "MaxAbsoluteError";
64+
public const string MinIterationTime = "MinIterationTime";
65+
public const string MinInvokeCount = "MinInvokeCount";
66+
public const string EvaluateOverhead = "EvaluateOverhead";
67+
public const string OutlierMode = "OutlierMode";
68+
public const string AnalyzeLaunchVariance = "AnalyzeLaunchVariance";
69+
70+
public const string Platform = "Platform";
71+
public const string Jit = "Jit";
72+
public const string Runtime = "Runtime";
73+
public const string Affinity = "Affinity";
74+
public const string Gc = "Gc";
75+
public const string EnvironmentVariables = "EnvironmentVariables";
76+
public const string PowerPlanMode = "PowerPlanMode";
77+
78+
public const string Server = "Server";
79+
public const string Concurrent = "Concurrent";
80+
public const string CpuGroups = "CpuGroups";
81+
public const string Force = "Force";
82+
public const string AllowVeryLargeObjects = "AllowVeryLargeObjects";
83+
public const string RetainVm = "RetainVm";
84+
public const string NoAffinitize = "NoAffinitize";
85+
public const string HeapAffinitizeMask = "HeapAffinitizeMask";
86+
public const string HeapCount = "HeapCount";
87+
88+
public const string Toolchain = "Toolchain";
89+
public const string Clock = "Clock";
90+
public const string EngineFactory = "EngineFactory";
91+
public const string BuildConfiguration = "BuildConfiguration";
92+
public const string Arguments = "Arguments";
93+
public const string NuGetReferences = "NuGetReferences";
94+
95+
public const string Environment = "Environment";
96+
public const string Run = "Run";
97+
public const string Infrastructure = "Infrastructure";
98+
public const string Accuracy = "Accuracy";
99+
public const string Meta = "Meta";
100+
101+
public const string Baseline = "Baseline";
102+
public const string IsMutator = "IsMutator";
103+
public const string IsDefault = "IsDefault";
104+
105+
public const string RunStrategy = "RunStrategy";
106+
public const string LaunchCount = "LaunchCount";
107+
public const string InvocationCount = "InvocationCount";
108+
public const string UnrollFactor = "UnrollFactor";
109+
public const string IterationCount = "IterationCount";
110+
public const string MinIterationCount = "MinIterationCount";
111+
public const string MaxIterationCount = "MaxIterationCount";
112+
public const string IterationTime = "IterationTime";
113+
public const string WarmupCount = "WarmupCount";
114+
public const string MinWarmupIterationCount = "MinWarmupIterationCount";
115+
public const string MaxWarmupIterationCount = "MaxWarmupIterationCount";
116+
public const string MemoryRandomization = "MemoryRandomization";
117+
}
118+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using JetBrains.Annotations;
2+
3+
namespace BenchmarkDotNet.Columns
4+
{
5+
[PublicAPI]
6+
public class ColumnHidingByIdRule: IColumnHidingRule
7+
{
8+
public string Id { get; }
9+
10+
public ColumnHidingByIdRule(IColumn column) => Id = column.Id;
11+
12+
public bool NeedToHide(IColumn column) => column.Id == Id;
13+
}
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using JetBrains.Annotations;
2+
3+
namespace BenchmarkDotNet.Columns
4+
{
5+
[PublicAPI]
6+
public class ColumnHidingByNameRule: IColumnHidingRule
7+
{
8+
public string Name { get; }
9+
10+
public ColumnHidingByNameRule(string name) => Name = name;
11+
12+
public bool NeedToHide(IColumn column) => column.ColumnName == Name;
13+
}
14+
}

0 commit comments

Comments
 (0)