Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions src/BenchmarkDotNet/Attributes/MemoryDiagnoserAttribute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@ public class MemoryDiagnoserAttribute : Attribute, IConfigSource
{
public IConfig Config { get; }

public MemoryDiagnoserAttribute()
/// <param name="displayGenColumns">Display Garbage Collections per Generation columns (Gen 0, Gen 1, Gen 2). True by default.</param>
public MemoryDiagnoserAttribute(bool displayGenColumns = true)
{
Config = ManualConfig.CreateEmpty().AddDiagnoser(MemoryDiagnoser.Default);
Config = ManualConfig.CreateEmpty().AddDiagnoser(new MemoryDiagnoser(new MemoryDiagnoserConfig(displayGenColumns)));
}
}
}
2 changes: 1 addition & 1 deletion src/BenchmarkDotNet/Configs/ImmutableConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ internal ImmutableConfig(
public IAnalyser GetCompositeAnalyser() => new CompositeAnalyser(analysers);
public IDiagnoser GetCompositeDiagnoser() => new CompositeDiagnoser(diagnosers);

public bool HasMemoryDiagnoser() => diagnosers.Contains(MemoryDiagnoser.Default);
public bool HasMemoryDiagnoser() => diagnosers.OfType<MemoryDiagnoser>().Any();

public bool HasThreadingDiagnoser() => diagnosers.Contains(ThreadingDiagnoser.Default);

Expand Down
16 changes: 11 additions & 5 deletions src/BenchmarkDotNet/Diagnosers/MemoryDiagnoser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,11 @@ public class MemoryDiagnoser : IDiagnoser
{
private const string DiagnoserId = nameof(MemoryDiagnoser);

public static readonly MemoryDiagnoser Default = new MemoryDiagnoser();
public static readonly MemoryDiagnoser Default = new MemoryDiagnoser(new MemoryDiagnoserConfig(displayGenColumns: true));

private MemoryDiagnoser() { } // we want to have only a single instance of MemoryDiagnoser
public MemoryDiagnoser(MemoryDiagnoserConfig config) => Config = config;

public MemoryDiagnoserConfig Config { get; }

public RunMode GetRunMode(BenchmarkCase benchmarkCase) => RunMode.NoOverhead;

Expand All @@ -33,9 +35,13 @@ public void Handle(HostSignal signal, DiagnoserActionParameters parameters) { }

public IEnumerable<Metric> ProcessResults(DiagnoserResults diagnoserResults)
{
yield return new Metric(GarbageCollectionsMetricDescriptor.Gen0, diagnoserResults.GcStats.Gen0Collections / (double)diagnoserResults.GcStats.TotalOperations * 1000);
yield return new Metric(GarbageCollectionsMetricDescriptor.Gen1, diagnoserResults.GcStats.Gen1Collections / (double)diagnoserResults.GcStats.TotalOperations * 1000);
yield return new Metric(GarbageCollectionsMetricDescriptor.Gen2, diagnoserResults.GcStats.Gen2Collections / (double)diagnoserResults.GcStats.TotalOperations * 1000);
if (diagnoserResults.GcStats.Gen0Collections > 0 && Config.DisplayGenColumns)
yield return new Metric(GarbageCollectionsMetricDescriptor.Gen0, diagnoserResults.GcStats.Gen0Collections / (double)diagnoserResults.GcStats.TotalOperations * 1000);
if (diagnoserResults.GcStats.Gen1Collections > 0 && Config.DisplayGenColumns)
yield return new Metric(GarbageCollectionsMetricDescriptor.Gen1, diagnoserResults.GcStats.Gen1Collections / (double)diagnoserResults.GcStats.TotalOperations * 1000);
if (diagnoserResults.GcStats.Gen2Collections > 0 && Config.DisplayGenColumns)
yield return new Metric(GarbageCollectionsMetricDescriptor.Gen2, diagnoserResults.GcStats.Gen2Collections / (double)diagnoserResults.GcStats.TotalOperations * 1000);

yield return new Metric(AllocatedMemoryMetricDescriptor.Instance, diagnoserResults.GcStats.BytesAllocatedPerOperation);
}

Expand Down
16 changes: 16 additions & 0 deletions src/BenchmarkDotNet/Diagnosers/MemoryDiagnoserConfig.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using JetBrains.Annotations;

namespace BenchmarkDotNet.Diagnosers
{
public class MemoryDiagnoserConfig
{
/// <param name="displayGenColumns">Display Garbage Collections per Generation columns (Gen 0, Gen 1, Gen 2). True by default.</param>
[PublicAPI]
public MemoryDiagnoserConfig(bool displayGenColumns = true)
{
DisplayGenColumns = displayGenColumns;
}

public bool DisplayGenColumns { get; }
}
}