BenchmarkDotNetVisualizer 1.0.2
Use version 1.0.3 or above
See the version list below for details.
dotnet add package BenchmarkDotNetVisualizer --version 1.0.2
NuGet\Install-Package BenchmarkDotNetVisualizer -Version 1.0.2
<PackageReference Include="BenchmarkDotNetVisualizer" Version="1.0.2" />
paket add BenchmarkDotNetVisualizer --version 1.0.2
#r "nuget: BenchmarkDotNetVisualizer, 1.0.2"
// Install BenchmarkDotNetVisualizer as a Cake Addin #addin nuget:?package=BenchmarkDotNetVisualizer&version=1.0.2 // Install BenchmarkDotNetVisualizer as a Cake Tool #tool nuget:?package=BenchmarkDotNetVisualizer&version=1.0.2
BenchmarkDotNetVisualizer
Visualizes your BenchmarkDotNet benchmarks to colorful images, feature-rich HTML, and customizable markdown files (and maybe powerful charts in the future!)
You can create something like this π
Table of Content
- A Real World Demo (.NET Collections Benchmark)
- Getting Started
- Todo
- Contributing
- Give it a Star! βοΈ
- License
A Real World Demo (.NET Collections Benchmark)
A comprehensive performance comparison benchmark between different .NET collections.
Getting Started
1. Install Package
PM> Install-Package BenchmarkDotNetVisualizer
2. Using Exporters
Example 1 (JSON Serializers Benchmark)
BenchmarkRunner.Run<JsonSerializersBenchmark>();
//Exports colorful image
[RichImageExporter(
title: "Json Serializers Benchmark",
groupByColumns: ["Method"], // Groups by 'Method' column and highlights groups
spectrumColumns: ["Mean", "Allocated"], // Colorizes 'Mean' and 'Allocated' columns as Spectrum and Sorts the result by them
//format: ImageFormat.Webp or Jpeg // You can set image format (Default is ImageFormat.Png)
)]
//Exports feature-rich HTML
[RichHtmlExporter(
title: "Json Serializers Benchmark",
groupByColumns: ["Method"], // Groups by 'Method' column and highlights groups
spectrumColumns: ["Mean", "Allocated"] // Colorizes 'Mean' and 'Allocated' columns as Spectrum and Sorts the result by them
//sortByColumns: ["Mean", "Allocated"] // You can also sort by other columns as you wish
)]
[MemoryDiagnoser(displayGenColumns: false)] // Displays Allocated column (without GC per Generation columns (Gen 0, Gen 1, Gen 2) due to false option)
public class JsonSerializersBenchmark { ... }
Output:
To see the results, navigate to the following path:
[ProjectDirectory]\bin\[Debug|Release]\[.NET-version]\BenchmarkDotNet.Artifacts\results\Benchmark-report-rich.html|png
3. Using Extensions methods on benchmark's Summary
var summary = BenchmarkRunner.Run<JsonSerializersBenchmark>();
//[ProjectDirectory]\Reports\JsonSerializers\Benchmark.html
var htmlFileName = DirectoryHelper.GetPathRelativeToProjectDirectory(@"Reports\JsonSerializers\Benchmark.html");
//[ProjectDirectory]\Reports\JsonSerializers\Benchmark.png
var imageFileName = DirectoryHelper.GetPathRelativeToProjectDirectory(@"Reports\JsonSerializers\Benchmark.png");
await summary.SaveAsHtmlAndImageAsync(
htmlPath: htmlFileName,
imagePath: imageFileName,
options: new ReportHtmlOptions
{
Title = "Json Serializers Benchmark",
GroupByColumns = ["Method"], // Groups by 'Method' column and highlights groups
SpectrumColumns = ["Mean", "Allocated"], // Colorizes 'Mean' and 'Allocated' columns as Spectrum
DividerMode = RenderTableDividerMode.EmptyDividerRow, // Separates tables by Empty Divider Row
HtmlWrapMode = HtmlDocumentWrapMode.Simple // Uses simple HTML table
});
Output HTML:
Visit HTML file in samples/Reports/JsonSerializers/Benchmark.html
Output Image:
Example 2 (Iterators for/foreach/ForEach() Benchmark)
Note (Recommended to use BenchmarkAutoRunner instead of BenchmarkRunner):
BenchmarkAutoRunner
is similar to BenchmarkRunner
but uses Job.Dry
with InProcessEmitToolchain
for DEBUG
Mode (due to ease of debugging) and your defined job for RELEASE
Mode
Also it Warns you if you are running project incorrectly (For example running with Attached Debugger while RELEASE
Mode is enabled)
//BenchmarkAutoRunner is similar to BenchmarkRunner but uses Job.Dry with InProcessEmitToolchain for DEBUG Mode (due to ease of debugging) and your defined job for RELEASE Mode
//Also it Warns you if you are running project incorrectly (For example running with Attached Debugger while RELEASE Mode is enabled)
var summary = BenchmarkAutoRunner.Run<IteratorsBenchmark>(); //Recommend instead use BenchmarkAutoRunner.Run<IteratorsBenchmark>();
//[ProjectDirectory]\Reports\Iterators\Benchmark.html
var htmlFileName = DirectoryHelper.GetPathRelativeToProjectDirectory(@"Reports\Iterators\Benchmark.html");
//[ProjectDirectory]\Reports\Iterators\Benchmark.png
var imageFileName = DirectoryHelper.GetPathRelativeToProjectDirectory(@"Reports\Iterators\Benchmark.png");
await summary.SaveAsHtmlAndImageAsync(
htmlPath: htmlFileName,
imagePath: imageFileName,
options: new ReportHtmlOptions
{
Title = "Performance Comparison between for, foreach, and ForEeach() method",
GroupByColumns = ["Runtime"], // Groups by column 'Runtime'
SpectrumColumns = ["Mean", "Allocated"], // Colorizes 'Mean' and 'Allocated' columns as Spectrum
DividerMode = RenderTableDividerMode.SeparateTables, // Separates tables by Grouping by 'GroupByColumns'
HtmlWrapMode = HtmlDocumentWrapMode.RichDataTables, // Uses feature-rich https://datatables.net plugin
});
Output HTML:
Visit HTML file in samples/Reports/Iterators/Benchmark.html
Output Image:
4. Using JoinReports method to Join and Pivot reports
Example 3 (Performance comparison between for, foreach, and ForEach() in different versions of .NET)
//BenchmarkAutoRunner is similar to BenchmarkRunner but uses Job.Dry with InProcessEmitToolchain for DEBUG Mode (due to ease of debugging) and your defined job for RELEASE Mode
//Also it Warns you if you are running project incorrectly (For example running with Attached Debugger while RELEASE Mode is enabled)
var summary = BenchmarkAutoRunner.Run<IteratorsBenchmark>(); //Recommend instead use BenchmarkAutoRunner.Run<IteratorsBenchmark>();
//[ProjectDirectory]\Reports\Iterators\JoinedBenchmark-PivotBy-Runtime.html
var htmlFileName = DirectoryHelper.GetPathRelativeToProjectDirectory(@"Reports\Iterators\JoinedBenchmark-PivotBy-Runtime.html");
//[ProjectDirectory]\Reports\Iterators\JoinedBenchmark-PivotBy-Runtime.png
var imageFileName = DirectoryHelper.GetPathRelativeToProjectDirectory(@"Reports\Iterators\JoinedBenchmark-PivotBy-Runtime.png");
await summary.JoinReportsAndSaveAsHtmlAndImageAsync(
htmlPath: htmlFileName,
imagePath: imageFileName,
options: new JoinReportHtmlOptions
{
Title = "Performance Comparison between for, foreach, and ForEeach() method",
MainColumn = "Method",
GroupByColumns = ["Categories", "Length"], // Groups by column 'Categories' and 'Length'
PivotProperty = "Runtime",
StatisticColumns = ["Mean"],
ColumnsOrder = [".NET Core 3.0", ".NET Core 3.1", ".NET 5.0", ".NET 6.0", ".NET 7.0", ".NET 8.0"], // Order of columns
DividerMode = RenderTableDividerMode.SeparateTables, //Separates tables by Grouping by 'GroupByColumns'
HtmlWrapMode = HtmlDocumentWrapMode.RichDataTables, //Uses feature-rich https://datatables.net plugin
});
Output HTML:
Visit HTML file in samples/Reports/Iterators/JoinedBenchmark-PivotBy-Runtime.html
Output Image:
Example 4 (Performance comparison between for, foreach, and ForEach() in different versions of .NET)
//BenchmarkAutoRunner is similar to BenchmarkRunner but uses Job.Dry with InProcessEmitToolchain for DEBUG Mode (due to ease of debugging) and your defined job for RELEASE Mode
//Also it Warns you if you are running project incorrectly (For example running with Attached Debugger while RELEASE Mode is enabled)
var summary = BenchmarkAutoRunner.Run<IteratorsBenchmark>(); //Recommend instead use BenchmarkAutoRunner.Run<IteratorsBenchmark>();
//[ProjectDirectory]\Reports\Iterators\JoinedBenchmark-PivotBy-Method.html
var htmlFileName = DirectoryHelper.GetPathRelativeToProjectDirectory(@"Reports\Iterators\JoinedBenchmark-PivotBy-Method.html");
//[ProjectDirectory]\Reports\Iterators\JoinedBenchmark-PivotBy-Method.png
var imageFileName = DirectoryHelper.GetPathRelativeToProjectDirectory(@"Reports\Iterators\JoinedBenchmark-PivotBy-Method.png");
await summary2.JoinReportsAndSaveAsHtmlAndImageAsync(
htmlPath: htmlFileName,
imagePath: imageFileName,
options: new JoinReportHtmlOptions
{
Title = "Performance Comparison between for, foreach, and ForEeach() method",
MainColumn = "Runtime",
GroupByColumns = ["Categories", "Length"], // Groups by column 'Categories' and 'Length'
PivotProperty = "Method",
StatisticColumns = ["Mean"],
ColumnsOrder = ["for", "foreach", "ForEach()"], // Order of columns
DividerMode = RenderTableDividerMode.SeparateTables, // Separates tables by Grouping by 'GroupByColumns'
HtmlWrapMode = HtmlDocumentWrapMode.RichDataTables, // Uses feature-rich https://datatables.net plugin
});
Output HTML:
Visit HTML file in samples/Reports/Iterators/JoinedBenchmark-PivotBy-Method.html
Output Image:
Todo
- Dark Theme (Need some help for this, wanna help? Please design a beautiful style for dark theme and send a PR)
- Chart Visualization
Contributing
Create an issue if you find a BUG or have a Suggestion or Question.
If you want to develop this project :
- Fork it!
- Create your feature branch:
git checkout -b my-new-feature
- Commit your changes:
git commit -am 'Add some feature'
- Push to the branch:
git push origin my-new-feature
- Submit a pull request
Give it a Star! βοΈ
If you find this repository useful and like it, why not give it a star? if not, never mind! π
License
Copyright Β© 2024 Mohammad Javad Ebrahimi under the MIT License.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 is compatible. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.1 is compatible. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.1
- BenchmarkDotNet (>= 0.13.12)
- PuppeteerSharp (>= 13.0.2)
- SixLabors.ImageSharp (>= 2.1.6)
- System.ComponentModel.Annotations (>= 5.0.0)
-
net5.0
- BenchmarkDotNet (>= 0.13.12)
- PuppeteerSharp (>= 13.0.2)
- SixLabors.ImageSharp (>= 2.1.6)
-
net6.0
- BenchmarkDotNet (>= 0.13.12)
- PuppeteerSharp (>= 13.0.2)
- SixLabors.ImageSharp (>= 3.1.2)
-
net7.0
- BenchmarkDotNet (>= 0.13.12)
- PuppeteerSharp (>= 13.0.2)
- SixLabors.ImageSharp (>= 3.1.2)
-
net8.0
- BenchmarkDotNet (>= 0.13.12)
- PuppeteerSharp (>= 13.0.2)
- SixLabors.ImageSharp (>= 3.1.2)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories (1)
Showing the top 1 popular GitHub repositories that depend on BenchmarkDotNetVisualizer:
Repository | Stars |
---|---|
mjebrahimi/EasyCompressor
β‘An Easy-to-Use and Optimized compression library for .NET that unified several compression algorithms including LZ4, Snappy, Zstd, LZMA, Brotli, GZip, ZLib, and Deflate. This library aids in Improving Performance by Reducing Memory Usage and Bandwidth Usage. Along with a greate Performance Benchmark between different compression algorithms.
|