Skip to content

fix: benchmark PRs now trigger CI builds for branch protection#78

Merged
cloud-hai-vo merged 2 commits intomainfrom
fix/benchmark-ci-skip
Mar 26, 2026
Merged

fix: benchmark PRs now trigger CI builds for branch protection#78
cloud-hai-vo merged 2 commits intomainfrom
fix/benchmark-ci-skip

Conversation

@cloud-hai-vo
Copy link
Copy Markdown
Contributor

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

  • Remove [skip ci] from benchmark commit message — CI now runs normally on the PR
  • Publish workflow: change guard from [skip ci] message check to github.actor != 'github-actions[bot]' — prevents NuGet publish for bot-authored README-only merges
  • No infinite loop risk: benchmark workflow already has if: github.actor != 'github-actions[bot]' guard

Test plan

  • Next benchmark PR should show CI build status
  • Merging benchmark PR should NOT trigger publish workflow

🤖 Generated with Claude Code

- 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>
@cloud-hai-vo cloud-hai-vo enabled auto-merge (squash) March 26, 2026 04:19
@cloud-hai-vo cloud-hai-vo merged commit 439b1e4 into main Mar 26, 2026
5 checks passed
@cloud-hai-vo cloud-hai-vo deleted the fix/benchmark-ci-skip branch March 26, 2026 04:20
@github-actions
Copy link
Copy Markdown
Contributor

📊 Benchmark Results

Generated: 2026-03-26 04:26 UTC  ·  Download full artifacts

Column guide:
Mean = average execution time  ·  Error = half of 99.9 % confidence interval  ·  StdDev = standard deviation  ·  Min / Median / Max = statistical range  ·  Ratio = vs Manual baseline (lower = closer to hand-written speed)  ·  RatioSD = ratio std dev  ·  Rank = 1 is fastest  ·  Gen0/1/2 = GC collections per 1 000 ops  ·  Allocated = managed heap per operation  ·  Alloc Ratio = allocation ratio vs baseline

🔵 Flat Mapping — 10-property object

Method Mean Error StdDev Min Median Max Ratio RatioSD Rank Gen0 Allocated Alloc Ratio
Manual 14.40 ns 0.736 ns 0.040 ns 14.37 ns 14.39 ns 14.45 ns 1.00 0.00 1 0.0048 80 B 1.00
EggMapper 24.74 ns 0.328 ns 0.018 ns 24.73 ns 24.74 ns 24.76 ns 1.72 0.00 2 0.0048 80 B 1.00
AutoMapper 80.42 ns 3.205 ns 0.176 ns 80.23 ns 80.46 ns 80.58 ns 5.58 0.02 3 0.0048 80 B 1.00
Mapster 27.31 ns 0.294 ns 0.016 ns 27.29 ns 27.31 ns 27.33 ns 1.90 0.00 2 0.0048 80 B 1.00
MapperlyMap 14.26 ns 1.379 ns 0.076 ns 14.19 ns 14.25 ns 14.34 ns 0.99 0.01 1 0.0048 80 B 1.00
AgileMapper 492.47 ns 15.385 ns 0.843 ns 491.63 ns 492.44 ns 493.32 ns 34.19 0.10 4 0.0200 344 B 4.30
EggMapperGenerator 14.81 ns 1.108 ns 0.061 ns 14.74 ns 14.84 ns 14.85 ns 1.03 0.00 1 0.0048 80 B 1.00
EggMapperClassMapper 14.69 ns 0.965 ns 0.053 ns 14.65 ns 14.67 ns 14.75 ns 1.02 0.00 1 0.0048 80 B 1.00

🟡 Flattening — 2 nested objects → 8 flat properties

Method Mean Error StdDev Min Median Max Ratio RatioSD Rank Gen0 Allocated Alloc Ratio
Manual 18.28 ns 1.019 ns 0.056 ns 18.21 ns 18.29 ns 18.32 ns 1.00 0.00 1 0.0048 80 B 1.00
EggMap 29.12 ns 7.154 ns 0.392 ns 28.88 ns 28.89 ns 29.57 ns 1.59 0.02 3 0.0048 80 B 1.00
AutoMapper 86.02 ns 13.395 ns 0.734 ns 85.29 ns 86.00 ns 86.76 ns 4.71 0.04 5 0.0048 80 B 1.00
Mapster 35.46 ns 6.161 ns 0.338 ns 35.21 ns 35.33 ns 35.84 ns 1.94 0.02 4 0.0048 80 B 1.00
MapperlyMap 23.85 ns 8.115 ns 0.445 ns 23.34 ns 24.04 ns 24.17 ns 1.31 0.02 2 0.0062 104 B 1.30
AgileMapper 487.74 ns 28.307 ns 1.552 ns 486.19 ns 487.73 ns 489.29 ns 26.69 0.10 6 0.0200 344 B 4.30

🟣 Deep Mapping — 2 nested address objects

Method Mean Error StdDev Min Median Max Ratio RatioSD Rank Gen0 Allocated Alloc Ratio
Manual 51.75 ns 7.968 ns 0.437 ns 51.28 ns 51.82 ns 52.15 ns 1.00 0.01 1 0.0162 272 B 1.00
EggMapper 61.89 ns 5.717 ns 0.313 ns 61.54 ns 61.99 ns 62.15 ns 1.20 0.01 1 0.0162 272 B 1.00
AutoMapper 117.20 ns 3.826 ns 0.210 ns 116.96 ns 117.31 ns 117.33 ns 2.26 0.02 2 0.0162 272 B 1.00
Mapster 65.50 ns 0.736 ns 0.040 ns 65.46 ns 65.50 ns 65.54 ns 1.27 0.01 1 0.0162 272 B 1.00
MapperlyMap 47.44 ns 6.514 ns 0.357 ns 47.11 ns 47.39 ns 47.82 ns 0.92 0.01 1 0.0162 272 B 1.00
AgileMapper 510.50 ns 30.260 ns 1.659 ns 508.59 ns 511.38 ns 511.53 ns 9.86 0.08 3 0.0248 424 B 1.56

🟢 Complex Mapping — nested object + collection

Method Mean Error StdDev Min Median Max Ratio RatioSD Rank Gen0 Allocated Alloc Ratio
Manual 67.97 ns 21.050 ns 1.154 ns 67.16 ns 67.46 ns 69.29 ns 1.00 0.02 1 0.0191 320 B 1.00
EggMapper 87.58 ns 4.465 ns 0.245 ns 87.35 ns 87.57 ns 87.83 ns 1.29 0.02 2 0.0191 320 B 1.00
AutoMapper 150.48 ns 16.589 ns 0.909 ns 149.54 ns 150.55 ns 151.35 ns 2.21 0.03 3 0.0196 328 B 1.02
Mapster 85.99 ns 2.877 ns 0.158 ns 85.84 ns 85.96 ns 86.15 ns 1.27 0.02 2 0.0191 320 B 1.00
MapperlyMap 69.63 ns 11.657 ns 0.639 ns 69.12 ns 69.42 ns 70.34 ns 1.02 0.02 1 0.0191 320 B 1.00
AgileMapper 553.08 ns 29.973 ns 1.643 ns 552.05 ns 552.21 ns 554.97 ns 8.14 0.12 4 0.0315 528 B 1.65

🟠 Collection — 100-item List<T>

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) adds Min, Median, and Max columns.
  • 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 '*'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant