BenchmarkDotNetVisualizer 1.0.6

There is a newer version of this package available.
See the version list below for details.
dotnet add package BenchmarkDotNetVisualizer --version 1.0.6                
NuGet\Install-Package BenchmarkDotNetVisualizer -Version 1.0.6                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="BenchmarkDotNetVisualizer" Version="1.0.6" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add BenchmarkDotNetVisualizer --version 1.0.6                
#r "nuget: BenchmarkDotNetVisualizer, 1.0.6"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install BenchmarkDotNetVisualizer as a Cake Addin
#addin nuget:?package=BenchmarkDotNetVisualizer&version=1.0.6

// Install BenchmarkDotNetVisualizer as a Cake Tool
#tool nuget:?package=BenchmarkDotNetVisualizer&version=1.0.6                

Examples:

NuGet NuGet License: MIT Build Status

BenchmarkDotNetVisualizer

Visualizes your BenchmarkDotNet benchmarks to Colorful images, Feature-rich HTML, and customizable markdown files (and maybe powerful charts in the future!)

In Simple Words: You can create something like this πŸ‘‡

for, foreach, ForEach() Benchmark

Table of Content

A Real World Demo (.NET Collections Benchmark πŸš€)

A Comprehensive Performance Comparison Benchmark Between Different .NET Collections.

https://github.com/mjebrahimi/DotNet-Collections-Benchmark/

Getting Started

1. Install Package

PM> Install-Package BenchmarkDotNetVisualizer

2. Simple Using

Methods:

  • SaveAsImageAsync()
  • SaveAsHtmlAsync()
  • SaveAsHtmlAndImageAsync()

Example:

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 this HTML page at samples/Reports/JsonSerializers/Benchmark.html

Output Image: Json Serializers Benchmark

3. Using Exporters

Exporters:

  • [RichImageExporter]
  • [RichHtmlExporter]

Example:

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

For Example:

  • MyBenchmark\bin\Release\net8.0\BenchmarkDotNet.Artifacts\results\Benchmark-report-rich.png
  • MyBenchmark\bin\Release\net8.0\BenchmarkDotNet.Artifacts\results\Benchmark-report-rich.html

Using BenchmarkAutoRunner to Run your benchmarks

It's Recommend to use BenchmarkAutoRunner.Run() instead of BenchmarkRunner.Run() to run your benchmarks.

BenchmarkAutoRunner is similar to BenchmarkRunner, but uses Job.Dry with InProcessEmitToolchain is case of DEBUG Mode (due to ease of debugging), and your specified job in case of RELEASE Mode.

It also Warns you if you are running project incorrectly. (for example running with Attached Debugger while RELEASE Mode is enabled)

var summary = BenchmarkAutoRunner.Run<IteratorsBenchmark>();

Using JoinReports method to Join and Pivot your reports

Example:

Performance benchmark between for, foreach, and ForEach() in different versions of .NET

Pivot by .NET Runtime version column
//Recommend to use BenchmarkAutoRunner instead of BenchmarkRunner
var summary = 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 ForEach() 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 this HTML page at samples/Reports/Iterators/JoinedBenchmark-PivotBy-Runtime.html

Output Image: Iterators Benchmark

Pivot by Method column
//Recommend to use BenchmarkAutoRunner instead of BenchmarkRunner
var summary = 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 ForEach() 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 this HTML page at samples/Reports/Iterators/JoinedBenchmark-PivotBy-Method.html

Output Image: Iterators Benchmark

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 :

  1. Fork it!
  2. Create your feature branch: git checkout -b my-new-feature
  3. Commit your changes: git commit -am 'Add some feature'
  4. Push to the branch: git push origin my-new-feature
  5. 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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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.
Version Downloads Last updated
2.0.1 363 8/16/2024
2.0.0 132 8/16/2024
1.0.7 211 7/12/2024
1.0.6 236 7/6/2024
1.0.5 767 2/4/2024
1.0.4 115 1/31/2024
1.0.3 163 1/21/2024
1.0.2 160 1/21/2024 1.0.2 is deprecated because it has critical bugs.
1.0.1 162 1/19/2024 1.0.1 is deprecated because it has critical bugs.
1.0.0 157 1/17/2024 1.0.0 is deprecated because it has critical bugs.