benchmarkdotnet - powerful .net library for benchmarking

54
BENCHMARKDOTNET - POWERFUL .NET LIBRARY FOR BENCHMARKING Larry Nung

Upload: larry-nung

Post on 14-Apr-2017

99 views

Category:

Technology


4 download

TRANSCRIPT

Page 1: BenchmarkDotNet  - Powerful .NET library for benchmarking

BENCHMARKDOTNET - POWERFUL .NET LIBRARY

FOR BENCHMARKINGLarry Nung

Page 2: BenchmarkDotNet  - Powerful .NET library for benchmarking

AGENDAIntroductionGetting startedJobsColumnsDiagnosersExportersParamsSetupBaselineReferenceQ & A 2

Page 3: BenchmarkDotNet  - Powerful .NET library for benchmarking

INTRODUCTION3

Page 4: BenchmarkDotNet  - Powerful .NET library for benchmarking

INTRODUCTION A powerful .NET library for benchmarking

Standard benchmarking routine: generating an isolated project per each benchmark method; auto-selection of iteration amount; warmup; overhead evaluation; statistics calculation; and so on.

Supported runtimes: Full .NET Framework, .NET Core (RTM), Mono

Supported languages: C#, F#, and Visual Basic Supported OS: Windows, Linux, MacOS Easy way to compare different environments

(x86 vs x64, LegacyJit vs RyuJit, and so on; see: Jobs) Reports: markdown, csv, html, plain text, png plots. Advanced features: Baseline, Params Powerful diagnostics based on ETW events

(see BenchmarkDotNet.Diagnostics.Windows)4

Page 5: BenchmarkDotNet  - Powerful .NET library for benchmarking

GETTING STARTED5

Page 6: BenchmarkDotNet  - Powerful .NET library for benchmarking

INSTALLATION Install-Package BenchmarkDotNet

6

Page 7: BenchmarkDotNet  - Powerful .NET library for benchmarking

INSTALLATION

7

Page 8: BenchmarkDotNet  - Powerful .NET library for benchmarking

INSTALLATION

8

Page 9: BenchmarkDotNet  - Powerful .NET library for benchmarking

INSTALLATION

9

Page 10: BenchmarkDotNet  - Powerful .NET library for benchmarking

INSTALLATION

10

Page 11: BenchmarkDotNet  - Powerful .NET library for benchmarking

WRITE CODE TO BENCHMARKusing BenchmarkDotNet.Attributes; … public class ProgramBenchmarker { protected Program m_Program { get;

set; } = new Program(); [Benchmark] public void Test() { m_Program.Test(); } } …

11

Page 12: BenchmarkDotNet  - Powerful .NET library for benchmarking

RUN THE BENCHMARKusing BenchmarkDotNet.Running; … public class Program { static void Main(string[] args) { var summary =

BenchmarkRunner.Run<ProgramBenchmarker>();

} public void Test() {… } } …}

12

Page 13: BenchmarkDotNet  - Powerful .NET library for benchmarking

VIEW RESULTS

13

Page 14: BenchmarkDotNet  - Powerful .NET library for benchmarking

ANALYZE RESULTS

14

Page 15: BenchmarkDotNet  - Powerful .NET library for benchmarking

JOBS15

Page 16: BenchmarkDotNet  - Powerful .NET library for benchmarking

JOBS Describes how to run your benchmark

Avaliable Jobs DryJob ClrJob CoreJob MonoJob LegacyJitX86Job LegacyJitX64 RyuJitX64Job SimpleJob LongRunJob MediumRunJob ShortRunJob VeryLongRunJob

16

Page 17: BenchmarkDotNet  - Powerful .NET library for benchmarking

JOBSusing BenchmarkDotNet.Attributes; using BenchmarkDotNet.Attributes.Jobs; ... [ShortRunJob] public class ProgramBenchmarker { ... }

17

Page 18: BenchmarkDotNet  - Powerful .NET library for benchmarking

JOBS

18

Page 19: BenchmarkDotNet  - Powerful .NET library for benchmarking

COLUMNS19

Page 20: BenchmarkDotNet  - Powerful .NET library for benchmarking

COLUMNS A column in the summary table

Available Columns NamespaceColumn MedianColumn MinColumn MaxColumn RankColumn e.t.c

20

Page 21: BenchmarkDotNet  - Powerful .NET library for benchmarking

COLUMNSusing BenchmarkDotNet.Attributes.Columns;…[NamespaceColumn] [MedianColumn] [MinColumn] [MaxColumn] [RankColumn][RankColumn(NumeralSystem.Roman)] [OrderProvider(SummaryOrderPolicy.FastestToSlowest)] public class ProgramBenchmarker { …} 21

Page 22: BenchmarkDotNet  - Powerful .NET library for benchmarking

COLUMNS

22

Page 23: BenchmarkDotNet  - Powerful .NET library for benchmarking

COLUMNSusing 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.GetHashCode().ToString())); } } …}

23

Page 24: BenchmarkDotNet  - Powerful .NET library for benchmarking

COLUMNS

24

Page 25: BenchmarkDotNet  - Powerful .NET library for benchmarking

COLUMNSusing BenchmarkDotNet.Columns; using BenchmarkDotNet.Reports; using BenchmarkDotNet.Running;…public class HashCodeColumn : IColumn { public string ColumnName { get; } = "HashCode"; public HashCodeColumn() { } public bool IsDefault(Summary summary, Benchmark benchmark)

=> false; public string GetValue(Summary summary, Benchmark benchmark)

=> benchmark.Target.Method.Name.GetHashCode().ToString(); public bool IsAvailable(Summary summary) => true; public bool AlwaysShow => true; public ColumnCategory Category => ColumnCategory.Custom; public string Id { get; } = "1"; public int PriorityInCategory { get; } = 0; public override string ToString() => ColumnName; }

25

Page 26: BenchmarkDotNet  - Powerful .NET library for benchmarking

COLUMNS…[Config(typeof(Config))] public class ProgramBenchmarker { private class Config : ManualConfig { public Config() { Add(new HashCodeColumn())); } } …}

26

Page 27: BenchmarkDotNet  - Powerful .NET library for benchmarking

DIAGNOSERS27

Page 28: BenchmarkDotNet  - Powerful .NET library for benchmarking

DIAGNOSERS Can attach to your benchmark and get some

useful info

Available Diagnosers MemoryDiagnoser

28

Page 29: BenchmarkDotNet  - Powerful .NET library for benchmarking

DIAGNOSERSusing BenchmarkDotNet.Attributes; using BenchmarkDotNet.Configs; using BenchmarkDotNet.Diagnosers; ... [Config(typeof(Config))] public class ProgramBenchmarker { private class Config : ManualConfig { public Config() { Add(MemoryDiagnoser.Default); } } ... }

29

Page 30: BenchmarkDotNet  - Powerful .NET library for benchmarking

DIAGNOSERSusing BenchmarkDotNet.Attributes; using BenchmarkDotNet.Configs; using BenchmarkDotNet.Diagnosers; ... [MemoryDiagnoser] public class ProgramBenchmarker { ... }

30

Page 31: BenchmarkDotNet  - Powerful .NET library for benchmarking

DIAGNOSERS

31

Page 32: BenchmarkDotNet  - Powerful .NET library for benchmarking

EXPORTERS32

Page 33: BenchmarkDotNet  - Powerful .NET library for benchmarking

EXPORTERS Allows you to export results of your benchmark in

different formats.By default, files with results will be located in .\BenchmarkDotNet.Artifacts\results directory.

Available Exporters HtmlExporter CsvExporter MarkdownExporter AsciiDocExporter CsvMeasurementsExporter PlainExporter JsonExporter 33

Page 34: BenchmarkDotNet  - Powerful .NET library for benchmarking

CONFIGusing

BenchmarkDotNet.Attributes.Exporters;…[AsciiDocExporter] [CsvMeasurementsExporter] [PlainExporter] [JsonExporter] public class ProgramBenchmarker { …}

34

Page 35: BenchmarkDotNet  - Powerful .NET library for benchmarking

CONFIGusing 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); } } …}

35

Page 36: BenchmarkDotNet  - Powerful .NET library for benchmarking

HTMLEXPORTER

36

Page 37: BenchmarkDotNet  - Powerful .NET library for benchmarking

MARKDOWNEXPORTER

37

Page 38: BenchmarkDotNet  - Powerful .NET library for benchmarking

CSVEXPORTER

38

Page 39: BenchmarkDotNet  - Powerful .NET library for benchmarking

ASCIIDOCEXPORTER

39

Page 40: BenchmarkDotNet  - Powerful .NET library for benchmarking

CSVMEASUREMENTSEXPORTER

40

Page 41: BenchmarkDotNet  - Powerful .NET library for benchmarking

PLAINEXPORTER

41

Page 42: BenchmarkDotNet  - Powerful .NET library for benchmarking

JSONEXPORTER

42

Page 43: BenchmarkDotNet  - Powerful .NET library for benchmarking

PARAMS43

Page 44: BenchmarkDotNet  - Powerful .NET library for benchmarking

PARAMSusing 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(); } } 44

Page 45: BenchmarkDotNet  - Powerful .NET library for benchmarking

PARAMS

45

Page 46: BenchmarkDotNet  - Powerful .NET library for benchmarking

SETUP46

Page 47: BenchmarkDotNet  - Powerful .NET library for benchmarking

SETUPusing BenchmarkDotNet.Attributes; ... public class ProgramBenchmarker { protected Program m_Program { get; set; } [Setup] public void Setup() { m_Program = new Program(); } [Benchmark] public void Test() { m_Program.Test(); } }

47

Page 48: BenchmarkDotNet  - Powerful .NET library for benchmarking

BASELINE48

Page 49: BenchmarkDotNet  - Powerful .NET library for benchmarking

BASELINEusing 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); } }

49

Page 50: BenchmarkDotNet  - Powerful .NET library for benchmarking

BASELINE

50

Page 51: BenchmarkDotNet  - Powerful .NET library for benchmarking

REFERENCE51

Page 52: BenchmarkDotNet  - Powerful .NET library for benchmarking

REFERENCE NuGet Gallery | BenchmarkDotNet 0.10.3

https://www.nuget.org/packages/BenchmarkDotNet

dotnet/BenchmarkDotNet: Powerful .NET library for benchmarking https://github.com/dotnet/BenchmarkDotNet

Home - BenchmarkDotNet Documentation http://benchmarkdotnet.org/

52

Page 53: BenchmarkDotNet  - Powerful .NET library for benchmarking

Q&A53

Page 54: BenchmarkDotNet  - Powerful .NET library for benchmarking

QUESTION & ANSWER

54