<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jagoba Inda Arizaleta</title>
    <description>The latest articles on DEV Community by Jagoba Inda Arizaleta (@jagobainda).</description>
    <link>https://dev.to/jagobainda</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3855592%2Fcbd29a2e-3633-47f9-ac1e-ab69fef887ea.png</url>
      <title>DEV Community: Jagoba Inda Arizaleta</title>
      <link>https://dev.to/jagobainda</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jagobainda"/>
    <language>en</language>
    <item>
      <title>I needed up-to-date .NET mapper benchmarks. They didn't exist.</title>
      <dc:creator>Jagoba Inda Arizaleta</dc:creator>
      <pubDate>Wed, 24 Jun 2026 01:28:39 +0000</pubDate>
      <link>https://dev.to/jagobainda/i-needed-up-to-date-net-mapper-benchmarks-they-didnt-exist-2fga</link>
      <guid>https://dev.to/jagobainda/i-needed-up-to-date-net-mapper-benchmarks-they-didnt-exist-2fga</guid>
      <description>&lt;h2&gt;
  
  
  The day AutoMapper stopped being a no-brainer
&lt;/h2&gt;

&lt;p&gt;For years, &lt;code&gt;AutoMapper&lt;/code&gt; was the default. You added the NuGet package, wrote a profile, and never thought about it again. That changed for me in 2025.&lt;/p&gt;

&lt;p&gt;Two things happened almost back to back:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;AutoMapper went commercial.&lt;/strong&gt; On July 2, 2025, Jimmy Bogard announced commercial editions of AutoMapper (and MediatR) under a new company, Lucky Penny Software. It's still free for individuals and companies under &lt;strong&gt;$5M USD in annual revenue&lt;/strong&gt;, but above that you now need a paid license. (&lt;a href="https://www.jimmybogard.com/automapper-and-mediatr-commercial-editions-launch-today/" rel="noopener noreferrer"&gt;announcement&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The last freely-patchable version got a high-severity CVE.&lt;/strong&gt; &lt;a href="https://github.com/advisories/GHSA-rvv3-g6hj-g44x" rel="noopener noreferrer"&gt;CVE-2026-32933&lt;/a&gt; (CVSS &lt;strong&gt;7.5&lt;/strong&gt;, High) is a Denial-of-Service via uncontrolled recursion: map a deeply nested object graph and you get a &lt;code&gt;StackOverflowException&lt;/code&gt; that takes the whole process down, and in modern .NET you can't even catch it. The catch? The fix landed in the paid versions (15.1.1 / 16.1.1).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So if you're on the free track, you're sitting on a known DoS with no free upgrade path. At work, that meant one thing: &lt;strong&gt;we had to migrate AutoMapper out of every project.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: nobody had fresh numbers
&lt;/h2&gt;

&lt;p&gt;There's no shortage of candidates: &lt;code&gt;Mapperly&lt;/code&gt;, &lt;code&gt;Mapster&lt;/code&gt;, &lt;code&gt;TinyMapper&lt;/code&gt;, &lt;code&gt;AgileMapper&lt;/code&gt;, or just writing the mapping by hand. The hard part wasn't finding options, it was figuring out which one to actually trust in production, and that's a call you want to make with &lt;em&gt;data&lt;/em&gt;, not vibes.&lt;/p&gt;

&lt;p&gt;I went looking for benchmarks and hit a wall:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Most comparisons were &lt;strong&gt;years old&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;None were run against &lt;strong&gt;.NET 10&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Library versions were stale, so the conclusions no longer applied.&lt;/li&gt;
&lt;li&gt;Everyone benchmarked slightly different scenarios, so you couldn't compare apples to apples.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Performance characteristics change with every runtime and every library release. A benchmark from 2021 tells you almost nothing about &lt;code&gt;Mapperly 4&lt;/code&gt; on .NET 10. I didn't want a snapshot. I wanted something that &lt;strong&gt;stays true over time&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So I built it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The solution: benchmarks that never go stale
&lt;/h2&gt;

&lt;p&gt;I built a &lt;a href="https://github.com/dotnet/BenchmarkDotNet" rel="noopener noreferrer"&gt;BenchmarkDotNet&lt;/a&gt; runner that measures the major .NET mappers across consistent scenarios, plus a small landing page to read the results.&lt;/p&gt;

&lt;p&gt;What makes it different from the "I benchmarked these one afternoon in 2022" posts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It runs every hour&lt;/strong&gt; on a dedicated VPS, automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Library versions auto-update&lt;/strong&gt; to the latest release, so the numbers always reflect what you'd actually install today.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Results are averaged over the last 3 months&lt;/strong&gt; to smooth out noise and show long-term trends, not a single lucky run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No raw JSON, no markdown walls&lt;/strong&gt;, just clean, interactive charts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What I measure
&lt;/h3&gt;

&lt;p&gt;Four scenarios that cover the cases you hit in real code:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;What it stresses&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SimpleFlat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Flat POCO to POCO, identical names&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;NestedObject&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Object graphs with nested types&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Collection&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mapping lists/arrays of objects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;NameDifference&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Source/target with mismatched property names&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For each one: &lt;strong&gt;mean execution time (μs)&lt;/strong&gt; and &lt;strong&gt;memory allocated per operation (bytes)&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I'm not posting the numbers here
&lt;/h2&gt;

&lt;p&gt;This is the part where a normal post drops a table of results and tells you which library "wins."&lt;/p&gt;

&lt;p&gt;I'm not going to do that, on purpose.&lt;/p&gt;

&lt;p&gt;If I freeze the numbers into this article, it becomes exactly the thing that sent me down this road in the first place: an outdated benchmark. In six months the versions will have moved, .NET will have a new release, and a screenshot from today would be quietly lying to whoever finds this post later.&lt;/p&gt;

&lt;p&gt;So instead of conclusions, here's the live data, always current:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://benchmarks.jagoba.dev/dotnet-mappers" rel="noopener noreferrer"&gt;benchmarks.jagoba.dev/dotnet-mappers&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open it, pick the scenario that matches your workload, and read today's results instead of mine from whenever you happen to read this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it / steal it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live benchmarks:&lt;/strong&gt; &lt;a href="https://benchmarks.jagoba.dev/dotnet-mappers" rel="noopener noreferrer"&gt;benchmarks.jagoba.dev/dotnet-mappers&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Benchmark runner:&lt;/strong&gt; &lt;a href="https://github.com/jagobainda/DotnetMappingBenchmarks" rel="noopener noreferrer"&gt;github.com/jagobainda/DotnetMappingBenchmarks&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The website:&lt;/strong&gt; &lt;a href="https://github.com/jagobainda/dotnet-mapping-benchmarks-web" rel="noopener noreferrer"&gt;github.com/jagobainda/dotnet-mapping-benchmarks-web&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If AutoMapper's licensing change or the CVE has you reconsidering your mapping layer, I hope this saves you the afternoon of benchmarking I had to do. And if you spot a scenario worth adding, the runner is open source, PRs welcome.&lt;/p&gt;

&lt;p&gt;What did you migrate to? I'm curious whether others landed on Mapperly, Mapster, or just went manual.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Sources: &lt;a href="https://www.jimmybogard.com/automapper-and-mediatr-commercial-editions-launch-today/" rel="noopener noreferrer"&gt;AutoMapper commercial editions announcement&lt;/a&gt; · &lt;a href="https://github.com/advisories/GHSA-rvv3-g6hj-g44x" rel="noopener noreferrer"&gt;GHSA-rvv3-g6hj-g44x / CVE-2026-32933&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>performance</category>
      <category>benchmarking</category>
    </item>
  </channel>
</rss>
