{"id":54212,"date":"2025-11-26T08:10:44","date_gmt":"2025-11-26T08:10:44","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=54212"},"modified":"2026-02-21T08:29:14","modified_gmt":"2026-02-21T08:29:14","slug":"benchmarking-benchmarkdotnet-the-ultimate-complete-tutorial","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/benchmarking-benchmarkdotnet-the-ultimate-complete-tutorial\/","title":{"rendered":"Benchmarking &amp; BenchmarkDotNet \u2013 The Ultimate Complete Tutorial"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><strong>1. What Are Benchmarks?<\/strong><\/h1>\n\n\n\n<p>A <strong>benchmark<\/strong> is a controlled, repeatable experiment that measures the <strong>performance characteristics<\/strong> of a piece of code.<\/p>\n\n\n\n<p>A good benchmark answers questions like:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>How long does this method take to run?<\/li>\n\n\n\n<li>How many CPU cycles does this algorithm consume?<\/li>\n\n\n\n<li>What is the memory allocation?<\/li>\n\n\n\n<li>How does performance change with input sizes?<\/li>\n\n\n\n<li>Does version A outperform version B?<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Benchmarking Focuses On:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Execution time (ns, \u00b5s, ms)<\/li>\n\n\n\n<li>Memory allocations<\/li>\n\n\n\n<li>Throughput (operations\/sec)<\/li>\n\n\n\n<li>JIT\/Runtime behavior<\/li>\n\n\n\n<li>GC impact<\/li>\n\n\n\n<li>Branch prediction &amp; micro-architectural effects<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><strong>2. Why Benchmarking Is Needed?<\/strong><\/h1>\n\n\n\n<p>Because <strong>developers guess<\/strong>, but <strong>numbers never lie<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Benchmarking helps you:<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 <strong>1. Compare two algorithms<\/strong><\/h3>\n\n\n\n<p>Example:<br><code>List&lt;T&gt;<\/code> vs <code>Span&lt;T&gt;<\/code> vs <code>Array<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 <strong>2. Detect regressions<\/strong><\/h3>\n\n\n\n<p>Upgrading from .NET 6 \u2192 8 \u2192 9 may change performance.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 <strong>3. Understand JIT optimizations<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>inlining<\/li>\n\n\n\n<li>bounds check elimination<\/li>\n\n\n\n<li>loop unrolling<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 <strong>4. Optimize hot paths<\/strong><\/h3>\n\n\n\n<p>Critical in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>microservices<\/li>\n\n\n\n<li>high-frequency trading<\/li>\n\n\n\n<li>game engines<\/li>\n\n\n\n<li>telemetry pipelines<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 <strong>5. Avoid \u201cfake performance perception\u201d<\/strong><\/h3>\n\n\n\n<p>Normal debugging\/profiling <strong>distorts<\/strong> real performance.<\/p>\n\n\n\n<p>A benchmark runs code:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>multiple times<\/li>\n\n\n\n<li>warms up the JIT<\/li>\n\n\n\n<li>isolates noise<\/li>\n\n\n\n<li>prints statistically correct data<\/li>\n<\/ul>\n\n\n\n<p>That is why <strong>BenchmarkDotNet exists<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><strong>3. What Is BenchmarkDotNet?<\/strong><\/h1>\n\n\n\n<p><strong>BenchmarkDotNet<\/strong> is an open-source, industry-standard <strong>benchmarking framework for .NET<\/strong> created by .NET performance experts.<\/p>\n\n\n\n<p>It is used by:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Microsoft .NET runtime team<\/li>\n\n\n\n<li>JetBrains<\/li>\n\n\n\n<li>StackOverflow<\/li>\n\n\n\n<li>Elastic<\/li>\n\n\n\n<li>Cloudflare<\/li>\n\n\n\n<li>Prof. Andrey Akinshin (GC expert)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 <strong>What it does?<\/strong><\/h3>\n\n\n\n<p>It automatically:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Compiles benchmarks in RELEASE mode<\/li>\n\n\n\n<li>Runs warm-ups<\/li>\n\n\n\n<li>Runs in-process or in a separate process<\/li>\n\n\n\n<li>Produces statistically accurate reports<\/li>\n\n\n\n<li>Removes JIT &amp; GC noise<\/li>\n\n\n\n<li>Exports results to HTML\/Markdown\/CSV<\/li>\n\n\n\n<li>Supports hardware counters (Perf Counters, PMCs)<\/li>\n\n\n\n<li>Works on Windows, Linux, macOS<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><strong>4. Key Features of BenchmarkDotNet (2026)<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u2714 Full cross-platform (.NET 6\u20139)<\/strong><\/h3>\n\n\n\n<p>Supports Windows\/Linux\/macOS, ARM64, Docker.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u2714 Automatic Environment Info<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CPU name<\/li>\n\n\n\n<li>OS version<\/li>\n\n\n\n<li>.NET runtime version<\/li>\n\n\n\n<li>Turbo boost, frequency<\/li>\n\n\n\n<li>GC mode<\/li>\n\n\n\n<li>Memory info<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u2714 Accurate measurements<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Warmup<\/li>\n\n\n\n<li>Pilot execution<\/li>\n\n\n\n<li>Auto iteration<\/li>\n\n\n\n<li>Outlier removal<\/li>\n\n\n\n<li>Confidence intervals<\/li>\n\n\n\n<li>Standard deviation<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u2714 Memory diagnostics<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Allocations per operation<\/li>\n\n\n\n<li>GC pressure<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u2714 Hardware counters<\/strong><\/h3>\n\n\n\n<p>Supports:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Branch misses<\/li>\n\n\n\n<li>Cache hits\/misses<\/li>\n\n\n\n<li>Instruction count<\/li>\n\n\n\n<li>CPU cycles<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u2714 Export formats<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>HTML<\/li>\n\n\n\n<li>Markdown<\/li>\n\n\n\n<li>JSON<\/li>\n\n\n\n<li>CSV<\/li>\n\n\n\n<li>GitHub-flavored tables<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u2714 Baseline comparison<\/strong><\/h3>\n\n\n\n<p>Easy before\/after performance comparison.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u2714 Parameterized benchmarks<\/strong><\/h3>\n\n\n\n<p>Run inputs like 10, 100, 1000 automatically.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><strong>5. Installing BenchmarkDotNet (Latest Version 2026)<\/strong><\/h1>\n\n\n\n<p>Run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotnet add package BenchmarkDotNet\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Verify:<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">dotnet <span class=\"hljs-keyword\">list<\/span> package\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><strong>6. Basic Workflow of BenchmarkDotNet<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 1 \u2014 Create a console app<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">dotnet <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">console<\/span> -n BenchmarksDemo\ncd BenchmarksDemo\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 2 \u2014 Install BenchmarkDotNet<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotnet add package BenchmarkDotNet\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 3 \u2014 Create Benchmark class<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Running;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">StringBenchmarks<\/span>\n<\/span>{\n    &#91;Benchmark]\n    <span class=\"hljs-keyword\">public<\/span> string ConcatPlus() =&gt; <span class=\"hljs-string\">\"Hello\"<\/span> + <span class=\"hljs-string\">\"World\"<\/span>;\n\n    &#91;Benchmark]\n    <span class=\"hljs-keyword\">public<\/span> string ConcatJoin() =&gt; string.Join(<span class=\"hljs-string\">\"\"<\/span>, <span class=\"hljs-string\">\"Hello\"<\/span>, <span class=\"hljs-string\">\"World\"<\/span>);\n\n    &#91;Benchmark]\n    <span class=\"hljs-keyword\">public<\/span> string ConcatStringBuilder()\n    {\n        <span class=\"hljs-keyword\">var<\/span> sb = <span class=\"hljs-keyword\">new<\/span> System.Text.StringBuilder();\n        sb.Append(<span class=\"hljs-string\">\"Hello\"<\/span>);\n        sb.Append(<span class=\"hljs-string\">\"World\"<\/span>);\n        <span class=\"hljs-keyword\">return<\/span> sb.ToString();\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 4 \u2014 Run benchmarks<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">BenchmarkRunner.Run<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">StringBenchmarks<\/span>&gt;<\/span>();\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 5 \u2014 Build &amp; Run (Always RELEASE mode)<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotnet run -c Release\n<\/code><\/span><\/pre>\n\n\n<p>BenchmarkDotNet automatically:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>emits code<\/li>\n\n\n\n<li>runs warmups<\/li>\n\n\n\n<li>executes millions of iterations<\/li>\n\n\n\n<li>prints HTML reports<\/li>\n<\/ul>\n\n\n\n<p>Output example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">|            Method |      Mean |    <span class=\"hljs-built_in\">Error<\/span> |   StdDev |   Allocated |\n|------------------ |----------:|---------:|---------:|------------:|\n|       ConcatPlus  |  <span class=\"hljs-number\">12.25<\/span> ns | <span class=\"hljs-number\">0.20<\/span> ns  | <span class=\"hljs-number\">0.18<\/span> ns  |           - |\n|       ConcatJoin  |  <span class=\"hljs-number\">23.12<\/span> ns | <span class=\"hljs-number\">0.18<\/span> ns  | <span class=\"hljs-number\">0.17<\/span> ns  |         <span class=\"hljs-number\">24<\/span> B|\n| ConcatStringBuilder | <span class=\"hljs-number\">45.55<\/span> ns | <span class=\"hljs-number\">0.55<\/span> ns | <span class=\"hljs-number\">0.50<\/span> ns |        <span class=\"hljs-number\">120<\/span> B|\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><strong>7. BenchmarkDotNet Commands \/ Attributes (Latest 2026 Guide)<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 <strong>[Benchmark]<\/strong><\/h3>\n\n\n\n<p>Marks a benchmark method.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 <strong>[MemoryDiagnoser]<\/strong><\/h3>\n\n\n\n<p>Adds memory usage &amp; allocations.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 <strong>[SimpleJob]<\/strong><\/h3>\n\n\n\n<p>Custom job configuration.<\/p>\n\n\n\n<p>Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">&#91;SimpleJob(RuntimeMoniker.Net80)]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">\u2714 <strong>[Params]<\/strong><\/h3>\n\n\n\n<p>Parameterized benchmark inputs.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-attr\">&#91;Params(10, 100, 1000)]<\/span>\n<span class=\"hljs-selector-tag\">public<\/span> <span class=\"hljs-selector-tag\">int<\/span> <span class=\"hljs-selector-tag\">Size<\/span>;\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">\u2714 <strong>[BenchmarkCategory]<\/strong><\/h3>\n\n\n\n<p>Categorize benchmarks.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 <strong>[IterationCount]<\/strong><\/h3>\n\n\n\n<p>Controls iterations.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 <strong>[WarmupCount]<\/strong><\/h3>\n\n\n\n<p>Warm-up run count.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 <strong>[Baseline]<\/strong><\/h3>\n\n\n\n<p>Mark comparison baseline.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 <strong>[RankColumn]<\/strong><\/h3>\n\n\n\n<p>Ranks the results.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 <strong>[Orderer]<\/strong><\/h3>\n\n\n\n<p>Sort results by speed.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 <strong>[HardwareCounters]<\/strong><\/h3>\n\n\n\n<p>Enable hardware-level CPU counters.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><strong>8. Practical Examples (Beginner \u2192 Advanced)<\/strong><\/h1>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\u2b50 <strong>Example 1: Basic Benchmark<\/strong><\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Running;\n\n&#91;MemoryDiagnoser]\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MathBenchmark<\/span>\n<\/span>{\n    &#91;Benchmark]\n    <span class=\"hljs-keyword\">public<\/span> double SqrtFast() =&gt; Math.Sqrt(<span class=\"hljs-number\">12345<\/span>);\n\n    &#91;Benchmark]\n    <span class=\"hljs-keyword\">public<\/span> double Pow() =&gt; Math.Pow(<span class=\"hljs-number\">12345<\/span>, <span class=\"hljs-number\">0.5<\/span>);\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n<\/span>{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> void Main() =&gt; BenchmarkRunner.Run&lt;MathBenchmark&gt;();\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\u2b50 <strong>Example 2: Compare two versions (Baseline)<\/strong><\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">&#91;MemoryDiagnoser]\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">LoopBench<\/span>\n<\/span>{\n    &#91;Benchmark(Baseline = <span class=\"hljs-keyword\">true<\/span>)]\n    <span class=\"hljs-keyword\">public<\/span> int ForLoop()\n    {\n        int sum = <span class=\"hljs-number\">0<\/span>;\n        <span class=\"hljs-keyword\">for<\/span> (int i = <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-number\">1000<\/span>; i++) sum += i;\n        <span class=\"hljs-keyword\">return<\/span> sum;\n    }\n\n    &#91;Benchmark]\n    <span class=\"hljs-keyword\">public<\/span> int LinqSum() =&gt; Enumerable.Range(<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">1000<\/span>).Sum();\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\u2b50 <strong>Example 3: Parameterized Benchmark<\/strong><\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">&#91;MemoryDiagnoser]\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ArrayBench<\/span>\n<\/span>{\n    &#91;Params(<span class=\"hljs-number\">10<\/span>, <span class=\"hljs-number\">100<\/span>, <span class=\"hljs-number\">1000<\/span>)]\n    <span class=\"hljs-keyword\">public<\/span> int N;\n\n    &#91;Benchmark]\n    <span class=\"hljs-keyword\">public<\/span> int&#91;] AllocateArray() =&gt; <span class=\"hljs-keyword\">new<\/span> int&#91;N];\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\u2b50 <strong>Example 4: Benchmark async\/await<\/strong><\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">&#91;MemoryDiagnoser]\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">AsyncBench<\/span>\n<\/span>{\n    &#91;Benchmark]\n    <span class=\"hljs-keyword\">public<\/span> async Task Delay() =&gt; await Task.Delay(<span class=\"hljs-number\">10<\/span>);\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\u2b50 <strong>Example 5: Benchmark with hardware counters<\/strong><\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">&#91;HardwareCounters(HardwareCounter.CacheMisses, HardwareCounter.BranchMispredictions)]\n&#91;MemoryDiagnoser]\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CpuBench<\/span>\n<\/span>{\n    &#91;Benchmark]\n    <span class=\"hljs-keyword\">public<\/span> void Work()\n    {\n        long x = <span class=\"hljs-number\">0<\/span>;\n        <span class=\"hljs-keyword\">for<\/span> (int i = <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-number\">1<\/span>_000_000; i++) x += i;\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><strong>9. Use Cases of BenchmarkDotNet<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Algorithm comparison<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>sorting<\/li>\n\n\n\n<li>searching<\/li>\n\n\n\n<li>hashing<\/li>\n\n\n\n<li>JSON serialization<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Testing performance regressions<\/h3>\n\n\n\n<p>Used in CI pipelines.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Microservices \/ API optimizations<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>cold start time<\/li>\n\n\n\n<li>deserialization<\/li>\n\n\n\n<li>routing<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Game engines<\/h3>\n\n\n\n<p>Unity developers use it for hot paths.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Memory optimization<\/h3>\n\n\n\n<p>Detect unnecessary allocations.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Comparing new .NET versions<\/h3>\n\n\n\n<p>.NET 6 \u2192 .NET 7 \u2192 .NET 8 \u2192 .NET 9 improvements.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Database client performance<\/h3>\n\n\n\n<p>EF Core, Dapper, MongoDB drivers.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><strong>10. Best Practices (2026 Edition)<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u2714 Always run benchmarks in Release mode<\/strong><\/h3>\n\n\n\n<p>Debug mode distorts everything.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u2714 Don\u2019t benchmark using IDE run button<\/strong><\/h3>\n\n\n\n<p>Must use:<br><code>dotnet run -c Release<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u2714 Don\u2019t benchmark noisy code<\/strong><\/h3>\n\n\n\n<p>Avoid:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>network I\/O<\/li>\n\n\n\n<li>disk<\/li>\n\n\n\n<li>random sleeps<\/li>\n\n\n\n<li>unpredictable cache<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u2714 Avoid too small methods<\/strong><\/h3>\n\n\n\n<p>JIT may inline them.<\/p>\n\n\n\n<p>Use:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">&#91;MethodImpl(MethodImplOptions.NoInlining)]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>\u2714 Use MemoryDiagnoser<\/strong><\/h3>\n\n\n\n<p>Memory is often more important than CPU.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u2714 Always isolate variables<\/strong><\/h3>\n\n\n\n<p>Use parameters instead of manual loops.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u2714 Avoid reading\/writing files<\/strong><\/h3>\n\n\n\n<p>Use mocks for consistency.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u2714 Use baselines<\/strong><\/h3>\n\n\n\n<p>Comparisons are clearer.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><strong>11. CI\/CD Integration (2026)<\/strong><\/h1>\n\n\n\n<p>BenchmarkDotNet supports running inside:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GitHub Actions<\/li>\n\n\n\n<li>GitLab CI<\/li>\n\n\n\n<li>Azure DevOps<\/li>\n\n\n\n<li>Jenkins<\/li>\n\n\n\n<li>TeamCity<\/li>\n<\/ul>\n\n\n\n<p>Use command:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">--exporters json\n--filter *BenchmarkName*\n<\/code><\/span><\/pre>\n\n\n<p>Example GitHub Action:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">- name: Run Benchmarks\n  run: dotnet run -c Release -- --filter *MyBench*\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><strong>12. BenchmarkDotNet Architecture (Simplified)<\/strong><\/h1>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Generate auto code<\/strong><\/li>\n\n\n\n<li><strong>Compile project separately<\/strong><\/li>\n\n\n\n<li><strong>Launch a new process<\/strong><\/li>\n\n\n\n<li><strong>Warm-up phase<\/strong><\/li>\n\n\n\n<li><strong>Pilot phase<\/strong><\/li>\n\n\n\n<li><strong>Targeted runs<\/strong><\/li>\n\n\n\n<li><strong>Statistical analysis<\/strong><\/li>\n\n\n\n<li><strong>HTML export<\/strong><\/li>\n\n\n\n<li><strong>Store results in \/BenchmarkDotNet.Artifacts\/<\/strong><\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><strong>13. Additional Useful Attributes (2026)<\/strong><\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Attribute<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td><code>[MinColumn, MaxColumn]<\/code><\/td><td>Show min\/max results<\/td><\/tr><tr><td><code>[StdDevColumn]<\/code><\/td><td>Standard deviation<\/td><\/tr><tr><td><code>[Orderer]<\/code><\/td><td>Sort results by speed<\/td><\/tr><tr><td><code>[RankColumn]<\/code><\/td><td>Rank results<\/td><\/tr><tr><td><code>[ThreadingDiagnoser]<\/code><\/td><td>Thread usage<\/td><\/tr><tr><td><code>[ConcurrencyVisualizer]<\/code><\/td><td>Thread visualization<\/td><\/tr><tr><td><code>[EtwProfiler]<\/code><\/td><td>ETW profiler<\/td><\/tr><tr><td><code>[DisassemblyDiagnoser]<\/code><\/td><td>JIT ASM output<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><strong>14. Advanced: Disassembly (JIT ASM)<\/strong><\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">&#91;DisassemblyDiagnoser(printSource: <span class=\"hljs-keyword\">true<\/span>)]\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Bench<\/span>\n<\/span>{\n    &#91;Benchmark]\n    <span class=\"hljs-keyword\">public<\/span> int Add() =&gt; <span class=\"hljs-number\">1<\/span> + <span class=\"hljs-number\">2<\/span>;\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotnet run -c Release -- --disasm\n<\/code><\/span><\/pre>\n\n\n<p>This shows machine instructions.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><strong>15. Summary<\/strong><\/h1>\n\n\n\n<p>You now have the <strong>most advanced<\/strong>, <strong>end-to-end<\/strong>, <strong>complete<\/strong>, <strong>updated (2026)<\/strong> tutorial for:<\/p>\n\n\n\n<p>\u2714 Benchmarking fundamentals<br>\u2714 BenchmarkDotNet features<br>\u2714 Install instructions<br>\u2714 Attributes list<br>\u2714 Commands<br>\u2714 CI\/CD Integration<br>\u2714 Best practices<br>\u2714 Baseline comparisons<br>\u2714 Memory and CPU diagnostics<br>\u2714 Examples from beginner to expert<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<p><\/p>\n\n\n\n<p>Just tell me!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>1. What Are Benchmarks? A benchmark is a controlled, repeatable experiment that measures the performance characteristics of a piece of code. A good benchmark answers questions like: \u2714 Benchmarking Focuses&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[11138],"tags":[],"class_list":["post-54212","post","type-post","status-publish","format-standard","hentry","category-best-tools"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/54212","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=54212"}],"version-history":[{"count":2,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/54212\/revisions"}],"predecessor-version":[{"id":59890,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/54212\/revisions\/59890"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=54212"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=54212"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=54212"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}