fix: benchmark PRs now trigger CI builds for branch protection#78
Merged
cloud-hai-vo merged 2 commits intomainfrom Mar 26, 2026
Merged
fix: benchmark PRs now trigger CI builds for branch protection#78cloud-hai-vo merged 2 commits intomainfrom
cloud-hai-vo merged 2 commits intomainfrom
Conversation
- Remove [skip ci] from benchmark commit message — was preventing CI from running, which blocked branch protection merge checks - Publish workflow: change guard from [skip ci] check to actor check (github.actor != 'github-actions[bot]') — prevents publishing NuGet for bot-authored README-only changes - Benchmark workflow already has actor guard to prevent re-triggering Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Contributor
📊 Benchmark Results
🔵 Flat Mapping — 10-property object
🟡 Flattening — 2 nested objects → 8 flat properties
🟣 Deep Mapping — 2 nested address objects
🟢 Complex Mapping — nested object + collection
🟠 Collection — 100-item
|
| Method | Mean | Error | StdDev | Min | Median | Max | Ratio | Rank | Gen0 | Gen1 | Allocated | Alloc Ratio |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Manual | 1.683 μs | 0.1444 μs | 0.0079 μs | 1.676 μs | 1.681 μs | 1.692 μs | 1.00 | 1 | 0.5283 | 0.0172 | 8.65 KB | 1.00 |
| EggMapper | 1.675 μs | 0.1213 μs | 0.0066 μs | 1.668 μs | 1.677 μs | 1.681 μs | 1.00 | 1 | 0.5283 | 0.0172 | 8.65 KB | 1.00 |
| AutoMapper | 2.254 μs | 0.0137 μs | 0.0007 μs | 2.253 μs | 2.254 μs | 2.255 μs | 1.34 | 2 | 0.6065 | 0.0191 | 9.95 KB | 1.15 |
| Mapster | 1.690 μs | 0.1396 μs | 0.0077 μs | 1.684 μs | 1.688 μs | 1.699 μs | 1.00 | 1 | 0.5283 | 0.0172 | 8.65 KB | 1.00 |
| MapperlyMap | 1.755 μs | 0.0610 μs | 0.0033 μs | 1.752 μs | 1.755 μs | 1.759 μs | 1.04 | 1 | 0.5283 | 0.0172 | 8.65 KB | 1.00 |
| AgileMapper | 2.417 μs | 0.2125 μs | 0.0116 μs | 2.405 μs | 2.420 μs | 2.427 μs | 1.44 | 2 | 0.5417 | 0.0153 | 8.91 KB | 1.03 |
🟠 Collection — 100-item List<T>
| Method | Mean | Error | StdDev | Min | Median | Max | Ratio | Rank | Gen0 | Gen1 | Allocated | Alloc Ratio |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Manual | 5.070 μs | 0.0388 μs | 0.0021 μs | 5.068 μs | 5.071 μs | 5.072 μs | 1.00 | 1 | 1.6708 | 0.0916 | 27.4 KB | 1.00 |
| EggMapper | 5.437 μs | 0.4888 μs | 0.0268 μs | 5.409 μs | 5.440 μs | 5.462 μs | 1.07 | 1 | 1.6708 | 0.0916 | 27.4 KB | 1.00 |
| AutoMapper | 6.306 μs | 0.6249 μs | 0.0343 μs | 6.270 μs | 6.311 μs | 6.337 μs | 1.24 | 1 | 1.7548 | 0.1068 | 28.7 KB | 1.05 |
| Mapster | 5.672 μs | 0.3950 μs | 0.0217 μs | 5.657 μs | 5.662 μs | 5.697 μs | 1.12 | 1 | 1.6708 | 0.0916 | 27.4 KB | 1.00 |
| MapperlyMap | 5.211 μs | 0.4053 μs | 0.0222 μs | 5.185 μs | 5.223 μs | 5.225 μs | 1.03 | 1 | 1.6785 | 0.0992 | 27.42 KB | 1.00 |
| AgileMapper | 5.065 μs | 0.2070 μs | 0.0113 μs | 5.054 μs | 5.066 μs | 5.076 μs | 1.00 | 1 | 1.0223 | 0.0610 | 16.72 KB | 0.61 |
🟠 Collection — 100-item List<T>
| Method | Mean | Error | StdDev | Min | Median | Max | Ratio | RatioSD | Rank | Gen0 | Gen1 | Allocated | Alloc Ratio |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Manual | 16.79 μs | 3.288 μs | 0.180 μs | 16.58 μs | 16.86 μs | 16.92 μs | 1.00 | 0.01 | 1 | 5.2490 | 1.3123 | 85.99 KB | 1.00 |
| EggMapper | 17.40 μs | 1.163 μs | 0.064 μs | 17.33 μs | 17.42 μs | 17.45 μs | 1.04 | 0.01 | 1 | 5.2490 | 1.3123 | 85.99 KB | 1.00 |
| AutoMapper | 21.99 μs | 1.863 μs | 0.102 μs | 21.88 μs | 22.00 μs | 22.08 μs | 1.31 | 0.01 | 1 | 5.7678 | 1.4343 | 94.34 KB | 1.10 |
| Mapster | 18.46 μs | 2.484 μs | 0.136 μs | 18.33 μs | 18.45 μs | 18.60 μs | 1.10 | 0.01 | 1 | 5.2490 | 1.3123 | 85.99 KB | 1.00 |
| MapperlyMap | 19.38 μs | 5.837 μs | 0.320 μs | 19.04 μs | 19.45 μs | 19.67 μs | 1.15 | 0.02 | 1 | 5.2490 | 1.2817 | 86.02 KB | 1.00 |
| AgileMapper | 22.06 μs | 3.087 μs | 0.169 μs | 21.91 μs | 22.03 μs | 22.24 μs | 1.31 | 0.02 | 1 | 5.2795 | 1.3123 | 86.25 KB | 1.00 |
⚪ Startup / Configuration time
| Method | Mean | Error | StdDev | Min | Median | Max | Ratio | RatioSD | Rank | Gen0 | Gen1 | Allocated | Alloc Ratio |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| EggMapperStartup | 1,260.319 μs | 1,464.7207 μs | 80.2863 μs | 1,178.487 μs | 1,263.505 μs | 1,338.964 μs | 1.003 | 0.08 | 3 | 3.9063 | 1.9531 | 94.48 KB | 1.00 |
| AutoMapperStartup | 411.687 μs | 1,325.8539 μs | 72.6745 μs | 330.680 μs | 433.218 μs | 471.163 μs | 0.328 | 0.05 | 2 | 5.8594 | - | 104.07 KB | 1.10 |
| MapsterStartup | 2.539 μs | 0.1530 μs | 0.0084 μs | 2.533 μs | 2.537 μs | 2.549 μs | 0.002 | 0.00 | 1 | 0.7019 | 0.0267 | 11.51 KB | 0.12 |
EggMapper.Benchmarks.ColdStartBenchmark-report-github
| Method | Mean | Error | StdDev | Min | Median | Max | Ratio | RatioSD | Rank | Gen0 | Gen1 | Allocated | Alloc Ratio |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| EggMapper | 1.294 ms | 1.027 ms | 0.0563 ms | 1.233 ms | 1.303 ms | 1.344 ms | 1.00 | 0.05 | 1 | 5.8594 | - | 95.81 KB | 1.00 |
| AutoMapper | 4.041 ms | 8.781 ms | 0.4813 ms | 3.574 ms | 4.015 ms | 4.536 ms | 3.13 | 0.34 | 2 | 15.6250 | 7.8125 | 310.39 KB | 3.24 |
| Mapster | 4.482 ms | 9.986 ms | 0.5474 ms | 3.872 ms | 4.642 ms | 4.931 ms | 3.47 | 0.39 | 2 | 39.0625 | 15.6250 | 762.29 KB | 7.96 |
📝 Notes
- Each benchmark class is decorated with
[MemoryDiagnoser]and[RankColumn]. - The global config (see
src/EggMapper.Benchmarks/Program.cs) addsMin,Median, andMaxcolumns. - Manual is the hand-written baseline (ratio = 1.00). A ratio < 1 means faster than manual.
- Benchmarks run on GitHub-hosted runners — absolute times may vary between runs; focus on Ratio for comparisons.
- To reproduce locally:
cd src/EggMapper.Benchmarks dotnet run --configuration Release -- --filter '*'
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
PR #77 (benchmark README update) has no CI build because the commit message contains
[skip ci]. This prevents branch protection checks from passing, so the PR can't be merged.Root Cause
The benchmark workflow added
[skip ci]to prevent infinite loops (benchmark push → triggers benchmark → pushes again). But this also skips the CI build/test workflow needed for branch protection.Fix
[skip ci]from benchmark commit message — CI now runs normally on the PR[skip ci]message check togithub.actor != 'github-actions[bot]'— prevents NuGet publish for bot-authored README-only mergesif: github.actor != 'github-actions[bot]'guardTest plan
🤖 Generated with Claude Code