Below you will find pages that utilize the taxonomy term “BenchmarkDotNet”
Posts
BenchmarkDotNet - Baseline
BenchmarkDotNet 如果要指定量測比較的標準,可在 BenchmarkAttribute 設定 Baseline 為 true,指定的量測方法即會被視為量測的標準,後續的量測則會跟該量測標準做比較。
像是下面這段程式:
using System.Threading; using BenchmarkDotNet.Attributes; ... public class ProgramBenchmarker { protected Program m_Program { get; set; } = new Program(); [Benchmark(Baseline = true)] public void Test1() { m_Program.Test(); Thread.Sleep(10); } [Benchmark] public void Test2() { m_Program.Test(); Thread.Sleep(20); } } 運行起來會看到設為基準的量測方法其 Scaled 值為 1,而另外一個量測方法其時間耗費大約為基準量測方法的兩倍,所以其 Scaled 值為 2。
read morePosts
BenchmarkDotNet - Params
使用 BenchmarkDotNet 時若需要設定欄位或是屬性的值,可以使用 ParamsAttribute 指定,像是下面這樣:
using BenchmarkDotNet.Attributes; ... public class ProgramBenchmarker { [Params(100, 200)] public int Parameter { get; set; } protected Program m_Program { get; set; } = new Program(); [Benchmark] public void Test() { m_Program.Test(); } } 運行時即會依序將指定的值帶入欄位或屬性下去量測。
read morePosts
BenchmarkDotNet - Exporters
Exporter 會將 benchmark 的結果輸出成不同的格式。
內建可使用的 Exporter 有:
HtmlExporter CsvExporter MarkdownExporter AsciiDocExporter CsvMeasurementsExporter PlainExporter JsonExporter 使用上只要透過 Attribue 掛上 benchmark 類別即可:
using BenchmarkDotNet.Attributes.Exporters; … [AsciiDocExporter] [CsvMeasurementsExporter] [PlainExporter] [JsonExporter] public class ProgramBenchmarker { … } 或是透過 config 的方式設定也可以。
using BenchmarkDotNet.Configs; using BenchmarkDotNet.Exporters; using BenchmarkDotNet.Exporters.Csv; using BenchmarkDotNet.Exporters.Json; … [Config(typeof(Config))] public class ProgramBenchmarker { private class Config : ManualConfig { public Config() { Add(AsciiDocExporter.Default); Add(CsvMeasurementsExporter.Default); Add(PlainExporter.Default); Add(JsonExporter.Default); } } … } HtmlExporter 的輸出會像這樣:
MarkdownExporter 的輸出會像這樣:
read morePosts
BenchmarkDotNet - Diagnosers
Diagnoser 可以附加到 benchmark 上,並獲取一些有用的資訊。像是內建的 MemoryDiagnoser 就可以幫我們獲取記憶體資訊。
使用上只要透過 Attribute 的方式加到要 benchmark 的類別即可。像是下面這樣:
using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Configs; using BenchmarkDotNet.Diagnosers; ... [MemoryDiagnoser] public class ProgramBenchmarker { ... } 或是透過 config 的方式設定也可以。
using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Configs; using BenchmarkDotNet.Diagnosers; ... [Config(typeof(Config))] public class ProgramBenchmarker { private class Config : ManualConfig { public Config() { Add(MemoryDiagnoser.Default); } } ... } 運行起來會看到多了 Allocated 欄位,顯示配置的記憶體量。
read morePosts
BenchmarkDotNet - Columns
BenchmarkDotNet 允許透過設定去變更 Summary Table 的 Column。
內建可使用的 Column 有:
NamespaceColumn MedianColumn MinColumn MaxColumn RankColumn 使用上只要透過 Attribue 掛上 benchmark 類別即可:
using BenchmarkDotNet.Attributes.Columns; … [NamespaceColumn] [MedianColumn] [MinColumn] [MaxColumn] [RankColumn] [RankColumn(NumeralSystem.Roman)] [OrderProvider(SummaryOrderPolicy.FastestToSlowest)] public class ProgramBenchmarker { … } 運行起來就會在 Summary Table 看到設定的欄位。
如果要加的欄位是未內建的,可透過 Config 與 TagColumn。像是這邊筆者想要加個 HashCode Column,其值為方法的 Hash 值,就可以像下面這樣撰寫:
using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Columns; using BenchmarkDotNet.Configs; … [Config(typeof(Config))] public class ProgramBenchmarker { private class Config : ManualConfig { public Config() { Add(new TagColumn("HashCode", item => item.
read morePosts
BenchmarkDotNet - Jobs
BenchmarkDotNet 的 Job 是用來描述 benchmark 是怎樣運行的。
內建的 Job 有:
DryJob ClrJob CoreJob MonoJob LegacyJitX86Job LegacyJitX64 RyuJitX64Job SimpleJob LongRunJob MediumRunJob ShortRunJob VeryLongRunJob Job 在使用上只要透過 Attribute 的方式加到要 benchmark 的類別即可。像是這邊想要跑短一點的 benchmark 就可以為 benchmark 類別加掛 ShortRunJobAttribute:
using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Attributes.Jobs; ... [ShortRunJob] public class ProgramBenchmarker { ... } 運行結果如下:
read morePosts
BenchmarkDotNet - Getting started
要使用 BenchmarkDotNet 去做 .NET 程式的 benchmark,可先透過 NuGet 安裝 BenchmarkDotNet 套件。
套件安裝好後進行 benchmark 程式的撰寫,撰寫方式只要寫個 benchmark 的方法,方法內去叫用要測的方法,最後在方法上面加上 BenchmarkAttribute 即可。
using BenchmarkDotNet.Attributes; … public class ProgramBenchmarker { protected Program m_Program { get; set; } = new Program(); [Benchmark] public void Test() { m_Program.Test(); } } … benchmark 程式寫好後撰寫 benchmark 運行的部份,只要透過 BenchmarkRunner.Run 帶入 benchmark 類別就可以了。
using BenchmarkDotNet.Running; … public class Program { static void Main(string[] args) { var summary = BenchmarkRunner.Run<ProgramBenchmarker>(); } public void Test() {… } } … } 完整的測試程式如下:
read more