https://github.com/kzu/mappingbenchmark
A comparison of in-memory mapping approaches
https://github.com/kzu/mappingbenchmark
Last synced: 5 months ago
JSON representation
A comparison of in-memory mapping approaches
- Host: GitHub
- URL: https://github.com/kzu/mappingbenchmark
- Owner: kzu
- License: mit
- Created: 2022-11-13T22:45:44.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2024-07-09T22:04:37.000Z (about 2 years ago)
- Last Synced: 2025-11-21T16:03:18.955Z (8 months ago)
- Language: C#
- Size: 48.8 KB
- Stars: 2
- Watchers: 0
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: readme.md
- License: license.txt
Awesome Lists containing this project
README
## In-Memory Mapping Benchmarks
Tests the following approaches:
1. Dynamic: creating object (hierarchies) by direct assignment of values from
a `dynamic` (anonymous) object using C# DLR dispatch
2. AutoMapper: using the same in-memory (anonymous) object and mapping to a
typed model.
3. MessagePack: deserializing from a memory stream (same object structure, but
from annotated object model)
4. System.Text.Json: deserializing from a memory stream populated by serializing
the (anonymous) object using Json.

``` ini
BenchmarkDotNet v0.13.12, Windows 11 (10.0.22622.575)
Intel Core i9-10900T CPU 1.90GHz, 1 CPU, 20 logical and 10 physical cores
.NET SDK 9.0.100-preview.2.24074.1
[Host] : .NET 8.0.1 (8.0.123.58001), X64 RyuJIT AVX2
.NET 6.0 : .NET 6.0.25 (6.0.2523.51912), X64 RyuJIT AVX2
.NET 8.0 : .NET 8.0.1 (8.0.123.58001), X64 RyuJIT AVX2
.NET Framework 4.7.2 : .NET Framework 4.8.1 (4.8.9181.0), X64 RyuJIT VectorSize=256
```
| Method | Job | Runtime | Mean | Error | StdDev | Ratio | Gen0 | Gen1 | Allocated | Alloc Ratio |
|------------ |--------------------- |--------------------- |----------:|---------:|---------:|------:|--------:|-------:|----------:|------------:|
| Dynamic | .NET 6.0 | .NET 6.0 | 20.62 μs | 0.372 μs | 0.290 μs | 0.55 | 3.2043 | 0.0916 | 32.82 KB | 0.87 |
| Dynamic | .NET 7.0 | .NET 7.0 | 20.08 μs | 0.307 μs | 0.257 μs | 0.54 | 3.2043 | 0.0916 | 32.82 KB | 0.87 |
| Dynamic | .NET Framework 4.7.2 | .NET Framework 4.7.2 | 37.34 μs | 0.320 μs | 0.284 μs | 1.00 | 6.1035 | 0.1831 | 37.63 KB | 1.00 |
| | | | | | | | | | | |
| AutoMapper | .NET 6.0 | .NET 6.0 | 15.79 μs | 0.284 μs | 0.237 μs | 0.47 | 2.2888 | 0.0610 | 23.41 KB | 0.83 |
| AutoMapper | .NET 7.0 | .NET 7.0 | 15.65 μs | 0.153 μs | 0.143 μs | 0.46 | 2.2888 | 0.0610 | 23.41 KB | 0.83 |
| AutoMapper | .NET Framework 4.7.2 | .NET Framework 4.7.2 | 33.68 μs | 0.374 μs | 0.350 μs | 1.00 | 4.5776 | 0.1221 | 28.2 KB | 1.00 |
| | | | | | | | | | | |
| MessagePack | .NET 6.0 | .NET 6.0 | 13.91 μs | 0.104 μs | 0.092 μs | 0.59 | 2.1515 | 0.0610 | 22.11 KB | 0.82 |
| MessagePack | .NET 7.0 | .NET 7.0 | 13.39 μs | 0.094 μs | 0.088 μs | 0.57 | 2.1515 | 0.0610 | 22.11 KB | 0.82 |
| MessagePack | .NET Framework 4.7.2 | .NET Framework 4.7.2 | 23.46 μs | 0.265 μs | 0.222 μs | 1.00 | 4.3640 | 0.1221 | 26.89 KB | 1.00 |
| | | | | | | | | | | |
| System Json | .NET 6.0 | .NET 6.0 | 122.63 μs | 1.462 μs | 1.368 μs | 0.54 | 6.3477 | 0.7324 | 65.71 KB | 0.93 |
| System Json | .NET 7.0 | .NET 7.0 | 117.95 μs | 1.102 μs | 0.977 μs | 0.52 | 6.1035 | 0.6104 | 63.39 KB | 0.90 |
| System Json | .NET Framework 4.7.2 | .NET Framework 4.7.2 | 228.99 μs | 1.725 μs | 1.529 μs | 1.00 | 11.4746 | 0.7324 | 70.63 KB | 1.00 |