Skip to content

Backend: exception handlers, controller advice, interceptors and validation - #6090

Merged
shai-almog merged 4 commits into
masterfrom
backend-controller-advice
Oct 25, 2026
Merged

shai-almog merged 4 commits into
masterfrom
backend-controller-advice

Conversation

@shai-almog

Copy link
Copy Markdown
Collaborator

Fixes #5993.

  • @ExceptionHandler on controllers and on @ControllerAdvice/@RestControllerAdvice beans, resolved at build time: controller first, then advice by @Order and bean name, closest exception type within each. Handlers may take the exception, the request and the HandlerMethod, and return a Response, a body or nothing.
  • Security failures (AccessDeniedException, AuthenticationException, CSRF) and Error are never offered to a handler, so error routing cannot bypass security.
  • HandlerInterceptor beans run after the security chain and route selection, with Spring's preHandle/postHandle/afterCompletion ordering. afterCompletion runs on every outcome. ExceptionResolver beans replace HandlerExceptionResolver.
  • @Valid plus @NotNull/@NotBlank/@NotEmpty/@Size/@Min/@Max generate plain checks (no reflection) with stable JSON field paths. An unhandled ValidationException answers a 400 JSON list of field errors. A constraint on a type that cannot carry it fails the build.
  • Developer guide: new sections in Backend-Web on errors, validation, interceptors, and a Servlet/MVC mapping table.

Tests: processor unit tests plus an end-to-end BackendBeansTest that runs a real server and checks the interaction with security (401 before interceptors run, 403 not overridden by a broad handler). build-engine verify and backend verify pass with SpotBugs, Checkstyle and the PMD report clean.

🤖 Generated with Claude Code

…dation

Controllers and @ControllerAdvice beans declare @ExceptionHandler methods,
resolved at build time by closest type and then advice order. Security
failures and Errors are never offered to a handler. HandlerInterceptor beans
run inside the security chain with Spring's preHandle/postHandle/
afterCompletion semantics. @Valid and the constraints in
com.codename1.backend.validation compile to plain checks that report stable
field paths; an unhandled ValidationException answers 400 JSON.

Fixes #5993

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Cloudflare Preview

@shai-almog

shai-almog commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 191 screenshots: 191 matched.

Native Android coverage

  • 📊 Line coverage: 19.18% (48152/251040 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 17.88% (228802/1279760), branch 12.19% (16783/137674), complexity 9.81% (12880/131234), method 14.81% (9096/61424), class 25.75% (1770/6875)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6367 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/736 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • okio.okio.Buffer – 0.00% (0/687 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/625 lines covered)
      • com.codename1.androidcompat.rt.com.codename1.androidcompat.rt.TextXmlPullParser – 0.00% (0/623 lines covered)
      • com.codename1.androidcompat.androidx.constraintlayout.core.widgets.com.codename1.androidcompat.androidx.constraintlayout.core.widgets.Flow – 0.00% (0/576 lines covered)

✅ Native Android screenshot tests passed.

Native Android coverage

  • 📊 Line coverage: 19.18% (48152/251040 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 17.88% (228802/1279760), branch 12.19% (16783/137674), complexity 9.81% (12880/131234), method 14.81% (9096/61424), class 25.75% (1770/6875)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6367 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/736 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • okio.okio.Buffer – 0.00% (0/687 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/625 lines covered)
      • com.codename1.androidcompat.rt.com.codename1.androidcompat.rt.TextXmlPullParser – 0.00% (0/623 lines covered)
      • com.codename1.androidcompat.androidx.constraintlayout.core.widgets.com.codename1.androidcompat.androidx.constraintlayout.core.widgets.Flow – 0.00% (0/576 lines covered)

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend scalar fallback (no native SIMD)
SIMD int-add (64K x300) java 183ms / native 151ms = 1.2x speedup
SIMD float-mul (64K x300) java 146ms / native 106ms = 1.3x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 81.000 ms
Base64 CN1 decode 90.000 ms
Base64 native encode 422.000 ms
Base64 encode ratio (CN1/native) 0.192x (80.8% faster)
Base64 native decode 296.000 ms
Base64 decode ratio (CN1/native) 0.304x (69.6% faster)
Image encode benchmark status skipped (SIMD unsupported)

@shai-almog

shai-almog commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 227 screenshots: 227 matched.
✅ JavaScript-port screenshot tests passed.

@shai-almog

shai-almog commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 206 screenshots: 206 matched.
Native Windows port, REAL shipping pipeline: the hellocodenameone screenshot suite rendered by a binary CROSS-COMPILED on Linux (clang-cl + xwin, WebView2 linked) and RUN on a Windows x64 runner. Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 28ms / native 2ms = 14.0x speedup
SIMD float-mul (64K x300) java 28ms / native 3ms = 9.3x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 36.000 ms
Base64 CN1 decode 44.000 ms
Base64 SIMD encode 55.000 ms
Base64 encode ratio (SIMD/CN1) 1.528x (52.8% slower)
Base64 SIMD decode 44.000 ms
Base64 decode ratio (SIMD/CN1) 1.000x (0.0% slower)
Image encode benchmark iterations 100
Image createMask (SIMD off) 5.000 ms
Image createMask (SIMD on) 3.000 ms
Image createMask ratio (SIMD on/off) 0.600x (40.0% faster)
Image applyMask (SIMD off) 14.000 ms
Image applyMask (SIMD on) 13.000 ms
Image applyMask ratio (SIMD on/off) 0.929x (7.1% faster)
Image modifyAlpha (SIMD off) 16.000 ms
Image modifyAlpha (SIMD on) 10.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.625x (37.5% faster)
Image modifyAlpha removeColor (SIMD off) 16.000 ms
Image modifyAlpha removeColor (SIMD on) 10.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.625x (37.5% faster)

@github-actions

github-actions Bot commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

✅ Continuous Quality Report

Test & Coverage

Static Analysis

  • SpotBugs [Report archive]
    • ✅ ByteCodeTranslator: 0 findings (no issues)
    • ✅ android: 0 findings (no issues)
    • ✅ android-compat: 0 findings (no issues)
    • ✅ android-res-compiler: 0 findings (no issues)
    • ✅ backend: 0 findings (no issues)
    • ✅ backend-test: 0 findings (no issues)
    • ✅ build-engine: 0 findings (no issues)
    • ✅ build-hint-catalog: 0 findings (no issues)
    • ✅ build-hint-tools: 0 findings (no issues)
    • ✅ codenameone-gradle-plugin: 0 findings (no issues)
    • ✅ codenameone-maven-plugin: 0 findings (no issues)
    • ✅ core-unittests: 0 findings (no issues)
    • ✅ desktop-compat-runtime: 0 findings (no issues)
    • ✅ fxml-compiler: 0 findings (no issues)
    • ✅ ios: 0 findings (no issues)
    • ✅ javac: 0 findings (no issues)
    • ✅ javafx-compat: 0 findings (no issues)
    • ✅ project-model: 0 findings (no issues)
    • ✅ swing-compat: 0 findings (no issues)
  • ✅ PMD: 0 findings (no issues) [Report archive]
  • ✅ Checkstyle: 0 findings (no issues) [Report archive]

Generated automatically by the PR CI workflow.

@github-actions

github-actions Bot commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Flutter vs Codename One

Same application, built both ways: Flutter's AOT compile of the gallery, and the identical Dart source transpiled to Java on Codename One. Lower is better for every metric, so a ratio above 1.00x means Codename One is ahead by that factor.

android

9 interleaved rounds; host load 0.56, 1.85, 1.54

Metric Codename One Flutter Ratio Winner
Installed size 78.2 MB 95.8 MB 1.22x Codename One
Executable code 4.6 MB 20.6 MB 4.42x Codename One
Download size (zipped) 78.2 MB 95.8 MB 1.22x Codename One
Cold start to first frame on screen 400 ms 1523 ms 3.81x Codename One
Memory at rest 44.4 MB 79.5 MB 1.79x Codename One

Start-up and memory at rest are judged round by round: the ratio is the median of the per-round ratios, each from two launches made back to back, and the times and sizes shown are each side's median, so the ratio need not equal their quotient. Codename One was ahead in 9 of 9 rounds on cold start to first frame on screen; 9 of 9 rounds on memory at rest.

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Workload Codename One Flutter Ratio
intArithmetic 89 ms 187 ms 2.10x
longArithmetic 64 ms 59 ms 0.92x
mathTranscendental 231 ms 358 ms 1.55x
arraySequential 31 ms 36 ms 1.16x
arrayRandom 329 ms 319 ms 0.97x
objectAllocation 67 ms 50 ms 0.75x
valueEscape 7 ms 7 ms 1.00x
hashMapChurn 142 ms 309 ms 2.18x
stringBuilding 97 ms 134 ms 1.38x
recursion 83 ms 274 ms 3.30x
quicksortBench 131 ms 154 ms 1.18x
Geometric mean 1.36x

Gate: within tolerance against scripts/flutter-bench/baseline.

Android sizes are for the arm64-v8a slice a phone is delivered, on both sides; Flutter's release apk carries three ABIs and would otherwise count its engine about three times.
Android start-up and memory come from an x86_64 emulator with a software GPU. They compare the two runtimes on one machine; they are not phone timings, and a renderer that leans on the GPU is penalised more there.
This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

ios

9 interleaved rounds; host load 18.19, 27.77, 21.54

Metric Codename One Flutter Ratio Winner
Installed size 108.1 MB 110.5 MB 1.02x Codename One
Executable code 17.1 MB 19.1 MB 1.11x Codename One
Download size (zipped) 80.0 MB 81.9 MB 1.02x Codename One
Cold start to first frame on screen -- -- -- not measured
Memory at rest -- -- -- not measured

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Not measured: iOS compute is not measured: a device build needs signed hardware, and on the simulator Flutter runs its JIT debug engine rather than AOT code. The macOS row runs the same ParparVM and Dart AOT compilers on the same Apple silicon.

Gate: within tolerance against scripts/flutter-bench/baseline. Smaller than its baseline, which does not fail the gate: Executable code -7.50% -- rebaseline to tighten. To accept the move, download this platform's baseline-<platform>.json artifact and run python3 scripts/flutter-bench/flutter_baseline.py calibrate --pr 6090 --reason "<why these moved>" baseline-ios.json, then commit the overlay it writes.

iOS start-up and memory are not measured here: Flutter cannot AOT-compile for the simulator, so a simulator run would time a JIT debug build against a release build. Sizes come from release device bundles; timings need signed hardware.
This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

javascript

9 interleaved rounds; host load 2.01, 1.3, 0.57

Metric Codename One Flutter Ratio Winner
Installed size 103.9 MB 122.5 MB 1.18x Codename One
Executable code 12.9 MB 25.2 MB 1.96x Codename One
Download size (zipped) 76.3 MB 84.1 MB 1.10x Codename One
Cold start to first frame on screen -- -- -- not measured
Memory at rest -- -- -- not measured

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Workload Codename One Flutter Ratio
intArithmetic 644 ms wrong result Flutter: wrong result
longArithmetic 5141 ms did not run Flutter: did not run
mathTranscendental 579 ms did not run Flutter: did not run
arraySequential 246 ms 82 ms 0.33x
arrayRandom 952 ms wrong result Flutter: wrong result
objectAllocation 38 ms 28 ms 0.74x
valueEscape 154 ms 7 ms 0.04x
hashMapChurn 1118 ms 245 ms 0.22x
stringBuilding 523 ms 107 ms 0.20x
recursion 508 ms 488 ms 0.96x
quicksortBench 402 ms wrong result Flutter: wrong result
Geometric mean 0.28x

Gate: within tolerance against scripts/flutter-bench/baseline; BEHIND FLUTTER on Compute (geomean of the VM workloads) (reported, not gated: a loss to Flutter on the web is currently accepted).

the JavaScript adapter needs a Chrome DevTools driver; sizes are reported and timings are not
This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

linux

9 interleaved rounds; host load 0.26, 2.88, 2.49

Metric Codename One Flutter Ratio Winner
Installed size 111.4 MB 143.8 MB 1.29x Codename One
Executable code 14.1 MB 16.1 MB 1.15x Codename One
Download size (zipped) 80.9 MB 92.9 MB 1.15x Codename One
Cold start to first frame on screen 156 ms 242 ms 1.56x Codename One
Memory at rest 86.0 MB 236.8 MB 2.80x Codename One

Start-up and memory at rest are judged round by round: the ratio is the median of the per-round ratios, each from two launches made back to back, and the times and sizes shown are each side's median, so the ratio need not equal their quotient. Codename One was ahead in 9 of 9 rounds on cold start to first frame on screen; 9 of 9 rounds on memory at rest.

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Workload Codename One Flutter Ratio
intArithmetic 74 ms 183 ms 2.47x
longArithmetic 56 ms 55 ms 0.98x
mathTranscendental 254 ms 276 ms 1.09x
arraySequential 16 ms 35 ms 2.19x
arrayRandom 265 ms 330 ms 1.25x
objectAllocation 26 ms 39 ms 1.50x
valueEscape 5 ms 7 ms 1.40x
hashMapChurn 49 ms 326 ms 6.65x
stringBuilding 33 ms 109 ms 3.30x
recursion 95 ms 257 ms 2.71x
quicksortBench 139 ms 149 ms 1.07x
Geometric mean 1.87x

Gate: within tolerance against scripts/flutter-bench/baseline.

This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

macos

9 interleaved rounds; host load 10.34, 24.34, 22.64

Metric Codename One Flutter Ratio Winner
Installed size 124.1 MB 139.4 MB 1.12x Codename One
Executable code 33.0 MB 47.9 MB 1.45x Codename One
Download size (zipped) 85.5 MB 93.3 MB 1.09x Codename One
Cold start to first frame on screen 305 ms 389 ms 1.25x Codename One
Memory at rest 36.8 MB 54.7 MB 1.48x Codename One

Start-up and memory at rest are judged round by round: the ratio is the median of the per-round ratios, each from two launches made back to back, and the times and sizes shown are each side's median, so the ratio need not equal their quotient. Codename One was ahead in 8 of 9 rounds on cold start to first frame on screen; 9 of 9 rounds on memory at rest.

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Workload Codename One Flutter Ratio
intArithmetic 118 ms 263 ms 2.23x
longArithmetic 79 ms 74 ms 0.94x
mathTranscendental 321 ms 347 ms 1.08x
arraySequential 12 ms 47 ms 3.92x
arrayRandom 288 ms 400 ms 1.39x
objectAllocation 65 ms 35 ms 0.54x
valueEscape 5 ms 15 ms 3.00x
hashMapChurn 41 ms 209 ms 5.10x
stringBuilding 27 ms 138 ms 5.11x
recursion 139 ms 317 ms 2.28x
quicksortBench 129 ms 159 ms 1.23x
Geometric mean 1.94x

Gate: within tolerance against scripts/flutter-bench/baseline. Smaller than its baseline, which does not fail the gate: Executable code -6.57% -- rebaseline to tighten. To accept the move, download this platform's baseline-<platform>.json artifact and run python3 scripts/flutter-bench/flutter_baseline.py calibrate --pr 6090 --reason "<why these moved>" baseline-macos.json, then commit the overlay it writes.

This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

windows

9 interleaved rounds

Metric Codename One Flutter Ratio Winner
Installed size 107.8 MB 121.1 MB 1.12x Codename One
Executable code 11.3 MB 14.1 MB 1.25x Codename One
Download size (zipped) 77.8 MB 86.4 MB 1.11x Codename One
Cold start to first frame on screen 125 ms 199 ms 1.59x Codename One
Memory at rest 58.4 MB 92.2 MB 1.58x Codename One

Start-up and memory at rest are judged round by round: the ratio is the median of the per-round ratios, each from two launches made back to back, and the times and sizes shown are each side's median, so the ratio need not equal their quotient. Codename One was ahead in 9 of 9 rounds on cold start to first frame on screen; 9 of 9 rounds on memory at rest.

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Workload Codename One Flutter Ratio
intArithmetic 70 ms 161 ms 2.30x
longArithmetic 53 ms 51 ms 0.96x
mathTranscendental 161 ms 193 ms 1.20x
arraySequential 8 ms 30 ms 3.75x
arrayRandom 232 ms 235 ms 1.01x
objectAllocation 16 ms 26 ms 1.62x
valueEscape 1 ms 6 ms 6.00x
hashMapChurn 38 ms 248 ms 6.53x
stringBuilding 27 ms 88 ms 3.26x
recursion 142 ms 233 ms 1.64x
quicksortBench 125 ms 127 ms 1.02x
Geometric mean 2.10x

Gate: within tolerance against scripts/flutter-bench/baseline. Smaller than its baseline, which does not fail the gate: Executable code -10.80%; Download size (zipped) -0.78% -- rebaseline to tighten. To accept the move, download this platform's baseline-<platform>.json artifact and run python3 scripts/flutter-bench/flutter_baseline.py calibrate --pr 6090 --reason "<why these moved>" baseline-windows.json, then commit the overlay it writes.

This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

Codename One wins 26 of 26 measured metrics across 6 platform(s).

@shai-almog

shai-almog commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 206 screenshots: 206 matched.
Native Windows port (x64 / Intel-AMD): full hellocodenameone screenshot suite rendered offscreen with Direct2D/DirectWrite, plus the real benchmarks (base64 native/CN1/SIMD, image createMask/applyMask/modifyAlpha/PNG/JPEG, SSE2 SIMD kernels). Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 62ms / native 4ms = 15.5x speedup
SIMD float-mul (64K x300) java 57ms / native 4ms = 14.2x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 73.000 ms
Base64 CN1 decode 90.000 ms
Base64 SIMD encode 113.000 ms
Base64 encode ratio (SIMD/CN1) 1.548x (54.8% slower)
Base64 SIMD decode 104.000 ms
Base64 decode ratio (SIMD/CN1) 1.156x (15.6% slower)
Image encode benchmark iterations 100
Image createMask (SIMD off) 13.000 ms
Image createMask (SIMD on) 4.000 ms
Image createMask ratio (SIMD on/off) 0.308x (69.2% faster)
Image applyMask (SIMD off) 26.000 ms
Image applyMask (SIMD on) 32.000 ms
Image applyMask ratio (SIMD on/off) 1.231x (23.1% slower)
Image modifyAlpha (SIMD off) 31.000 ms
Image modifyAlpha (SIMD on) 48.000 ms
Image modifyAlpha ratio (SIMD on/off) 1.548x (54.8% slower)
Image modifyAlpha removeColor (SIMD off) 33.000 ms
Image modifyAlpha removeColor (SIMD on) 32.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.970x (3.0% faster)

ParparVM vs HotSpot (JDK 25): Windows x64

Runner CPU: AMD64 Family 25 Model 1 Stepping 1, AuthenticAMD (baseline windows-x64@amd64-family-25-model-1-authenticamd)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (WinHelloMain) 4 1.54x (base 1.22x, +26.3%) 0.55x (base 0.94x, -41.4%) ok
translator (self) 4 0.80x (base 0.83x, -4.3%) 0.53x (base 0.54x, -1.8%) ok
intArithmetic 4 1.10x (base 1.10x, +0.0%) 0.06x (base 0.06x, +2.9%) ok
longArithmetic 4 1.14x (base 1.08x, +5.1%) 0.06x (base 0.05x, +3.4%) ok
mathTranscendental 4 0.78x (base 0.79x, -0.8%) 0.06x (base 0.06x, +3.1%) ok
arraySequential 4 1.33x (base 1.36x, -2.5%) 0.39x (base 0.39x, +0.5%) ok
arrayRandom 4 0.95x (base 1.06x, -10.3%) 0.23x (base 0.23x, +0.7%) ok
objectAllocation 4 1.52x (base 1.56x, -2.7%) 0.30x (base 0.39x, -23.2%) ok
valueEscape 4 0.10x (base 0.10x, +0.4%) 0.05x (base 0.04x, +5.7%) ok
hashMapChurn 4 1.88x (base 1.80x, +4.7%) 0.09x (base 0.09x, -3.6%) ok
stringBuilding 4 1.22x (base 1.22x, +0.5%) 0.32x (base 0.32x, +0.3%) ok
recursion 4 1.41x (base 1.49x, -5.9%) 0.06x (base 0.06x, +1.7%) ok
quicksort 4 1.11x (base 1.13x, -2.2%) 0.12x (base 0.12x, +0.9%) ok

Result: no regression

@shai-almog

shai-almog commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 206 screenshots: 206 matched.
Native Linux port (x64), GTK3/Cairo/Pango, ParparVM bytecode-to-C (no JVM): the hellocodenameone screenshot suite rendered by a native ELF built + run on the GitHub x64 runner. Baseline: scripts/linux/screenshots.

ParparVM vs HotSpot (JDK 25): Linux x64

Runner CPU: AMD EPYC 9V45 96-Core Processor (baseline linux-x64@amd-epyc-9v45-96-core-processor)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (LinuxHelloMain) 4 0.99x (base 0.92x, +8.0%) 0.66x (base 0.84x, -21.8%) ok
translator (self) 4 0.60x (base 0.64x, -5.8%) 0.53x (base 0.55x, -3.2%) ok
intArithmetic 4 1.00x (base 1.00x, -0.2%) 0.06x (base 0.06x, +0.8%) ok
longArithmetic 4 1.00x (base 0.99x, +0.5%) 0.07x (base 0.07x, +1.1%) ok
mathTranscendental 4 1.19x (base 1.20x, -0.6%) 0.06x (base 0.06x, +2.0%) ok
arraySequential 4 2.87x (base 2.91x, -1.3%) 0.36x (base 0.36x, +0.1%) ok
arrayRandom 4 1.02x (base 1.04x, -1.7%) 0.21x (base 0.23x, -8.1%) ok
objectAllocation 4 1.66x (base 1.61x, +3.3%) 0.27x (base 0.24x, +14.8%) ok
valueEscape 4 0.10x (base 0.12x, -15.5%) 0.04x (base 0.04x, +1.5%) ok
hashMapChurn 4 1.31x (base 1.31x, +0.0%) 0.09x (base 0.09x, +0.9%) ok
stringBuilding 4 1.57x (base 1.58x, -0.6%) 0.26x (base 0.22x, +20.2%) ok
recursion 4 1.36x (base 1.34x, +1.4%) 0.06x (base 0.08x, -24.3%) ok
quicksort 4 1.07x (base 1.06x, +1.1%) 0.13x (base 0.11x, +17.8%) ok

Result: no regression

@shai-almog

shai-almog commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 206 screenshots: 206 matched.
Native Linux port (arm64), GTK3/Cairo/Pango, ParparVM bytecode-to-C (no JVM): the hellocodenameone screenshot suite rendered by a native ELF built + run on the GitHub arm64 runner. Baseline: scripts/linux/screenshots-arm.

ParparVM vs HotSpot (JDK 25): Linux arm64

Runner CPU: Neoverse-N2 (baseline linux-arm64@neoverse-n2)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (LinuxHelloMain) 4 0.97x (base 1.02x, -4.7%) 0.65x (base 0.93x, -30.6%) ok
translator (self) 4 0.74x (base 0.70x, +6.7%) 0.44x (base 0.43x, +2.9%) ok
intArithmetic 4 1.05x (base 1.04x, +0.0%) 0.03x (base 0.03x, +4.3%) ok
longArithmetic 4 0.79x (base 0.79x, -0.1%) 0.03x (base 0.03x, +4.8%) ok
mathTranscendental 4 1.09x (base 1.10x, -0.4%) 0.04x (base 0.03x, +9.3%) ok
arraySequential 4 0.35x (base 0.36x, -3.5%) 0.37x (base 0.37x, +0.1%) ok
arrayRandom 4 0.93x (base 0.94x, -0.5%) 0.20x (base 0.20x, +0.7%) ok
objectAllocation 4 1.83x (base 1.77x, +3.5%) 0.37x (base 0.37x, -1.2%) ok
valueEscape 4 0.51x (base 0.51x, -0.1%) 0.03x (base 0.03x, +5.1%) ok
hashMapChurn 4 0.85x (base 0.84x, +0.9%) 0.12x (base 0.12x, -0.1%) ok
stringBuilding 4 1.37x (base 1.57x, -12.7%) 0.26x (base 0.26x, -0.3%) ok
recursion 4 1.41x (base 1.43x, -1.5%) 0.04x (base 0.04x, +2.9%) ok
quicksort 4 1.00x (base 0.99x, +1.0%) 0.09x (base 0.09x, +1.0%) ok

Result: no regression

@shai-almog

shai-almog commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 206 screenshots: 206 matched.
Native Windows port (arm64 / Apple Silicon - Arm): full hellocodenameone screenshot suite rendered offscreen with Direct2D/DirectWrite, plus the real benchmarks (base64 native/CN1/SIMD, image createMask/applyMask/modifyAlpha/PNG/JPEG, NEON SIMD kernels). Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 50ms / native 3ms = 16.6x speedup
SIMD float-mul (64K x300) java 48ms / native 3ms = 16.0x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 60.000 ms
Base64 CN1 decode 71.000 ms
Base64 SIMD encode 77.000 ms
Base64 encode ratio (SIMD/CN1) 1.283x (28.3% slower)
Base64 SIMD decode 73.000 ms
Base64 decode ratio (SIMD/CN1) 1.028x (2.8% slower)
Image encode benchmark iterations 100
Image createMask (SIMD off) 6.000 ms
Image createMask (SIMD on) 3.000 ms
Image createMask ratio (SIMD on/off) 0.500x (50.0% faster)
Image applyMask (SIMD off) 20.000 ms
Image applyMask (SIMD on) 22.000 ms
Image applyMask ratio (SIMD on/off) 1.100x (10.0% slower)
Image modifyAlpha (SIMD off) 18.000 ms
Image modifyAlpha (SIMD on) 14.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.778x (22.2% faster)
Image modifyAlpha removeColor (SIMD off) 22.000 ms
Image modifyAlpha removeColor (SIMD on) 15.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.682x (31.8% faster)

ParparVM vs HotSpot (JDK 25): Windows arm64

Runner CPU: ARMv8 (64-bit) Family 8 Model D49 Revision 0, MICROSOFT CORPORATION (baseline windows-arm64@armv8-64-bit-family-8-model-d49-microsoft-corporation)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (WinHelloMain) 4 1.00x (base 1.11x, -9.4%) 0.60x (base 0.75x, -20.2%) ok
translator (self) 4 0.87x (base 0.84x, +4.3%) 0.48x (base 0.51x, -4.6%) ok
intArithmetic 4 1.04x (base 1.04x, -0.0%) 0.06x (base 0.06x, +3.2%) ok
longArithmetic 4 0.79x (base 0.80x, -0.0%) 0.06x (base 0.06x, +3.6%) ok
mathTranscendental 4 0.72x (base 0.72x, -0.3%) 0.07x (base 0.06x, +1.8%) ok
arraySequential 4 0.36x (base 0.46x, -20.8%) 0.39x (base 0.39x, +0.2%) ok
arrayRandom 4 0.94x (base 0.94x, +0.2%) 0.23x (base 0.23x, +0.4%) ok
objectAllocation 4 1.78x (base 1.82x, -2.2%) 0.40x (base 0.43x, -7.0%) ok
valueEscape 4 0.76x (base 0.76x, +0.0%) 0.05x (base 0.05x, +4.3%) ok
hashMapChurn 4 0.99x (base 0.98x, +0.7%) 0.12x (base 0.12x, +0.2%) ok
stringBuilding 4 1.60x (base 1.43x, +11.9%) 0.27x (base 0.27x, -0.4%) ok
recursion 4 1.55x (base 1.46x, +5.9%) 0.07x (base 0.07x, +1.3%) ok
quicksort 4 1.01x (base 1.00x, +0.6%) 0.12x (base 0.12x, +0.7%) ok

Result: no regression

… includes

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Developer Guide build artifacts are available for download from this workflow run:

Developer Guide quality checks:

  • AsciiDoc linter: No issues found (report)
  • Vale: No alerts found (report)
  • Paragraph capitalization: No paragraph capitalization issues (report)
  • LanguageTool: No grammar matches (report)
  • Image references: No unused images detected (report)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

✅ ByteCodeTranslator Quality Report

Test & Coverage

  • ✅ Tests: 880 total, 0 failed, 55 skipped

Benchmark Results

  • Execution Time: 6255 ms

  • Hotspots (Top 20 sampled methods):

    • 8.91% com.codename1.tools.translator.IteratorEscape.mangle (92 samples)
    • 6.78% com.codename1.tools.translator.BytecodeMethod.equals (70 samples)
    • 5.04% java.util.ArrayList.indexOf (52 samples)
    • 3.78% java.lang.System.identityHashCode (39 samples)
    • 3.59% java.lang.Object.hashCode (37 samples)
    • 2.23% com.codename1.tools.translator.JavascriptReachability.enqueueResolved (23 samples)
    • 2.03% java.util.AbstractCollection.containsAll (21 samples)
    • 1.94% java.lang.StringBuilder.append (20 samples)
    • 1.84% com.codename1.tools.translator.IteratorEscape.ctorOnlyStoresParamsIntoThis (19 samples)
    • 1.84% com.codename1.tools.translator.IteratorEscape.walk (19 samples)
    • 1.84% com.codename1.tools.translator.bytecodes.Invoke.resolveDirectTarget (19 samples)
    • 1.84% com.codename1.tools.translator.ByteCodeClass.hasDeclaredMethod (19 samples)
    • 1.74% com.codename1.tools.translator.BytecodeMethod.updateInlinableFieldDependencies (18 samples)
    • 1.65% com.codename1.tools.translator.BytecodeMethod.addToConstantPool (17 samples)
    • 1.45% java.lang.String.equals (15 samples)
    • 1.36% com.codename1.tools.translator.DeadFieldElimination.run (14 samples)
    • 1.36% java.io.FileOutputStream.writeBytes (14 samples)
    • 1.26% com.codename1.tools.translator.Parser.cullMethods (13 samples)
    • 1.26% com.codename1.tools.translator.ByteCodeClass.markDependencies (13 samples)
    • 1.26% java.util.HashMap.hash (13 samples)
  • ⚠️ Coverage report not generated.

Static Analysis

  • ✅ SpotBugs: no findings (report was not generated by the build).
  • ⚠️ PMD report not generated.
  • ⚠️ Checkstyle report not generated.

Generated automatically by the PR CI workflow.

@shai-almog

shai-almog commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 192 screenshots: 192 matched.
✅ Native Mac screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 471 seconds

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 58ms / native 3ms = 19.3x speedup
SIMD float-mul (64K x300) java 53ms / native 3ms = 17.6x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 63.000 ms
Base64 CN1 decode 67.000 ms
Image encode benchmark iterations 100
Image createMask (SIMD off) 10.000 ms
Image createMask (SIMD on) 11.000 ms
Image createMask ratio (SIMD on/off) 1.100x (10.0% slower)
Image applyMask (SIMD off) 72.000 ms
Image applyMask (SIMD on) 68.000 ms
Image applyMask ratio (SIMD on/off) 0.944x (5.6% faster)
Image modifyAlpha (SIMD off) 68.000 ms
Image modifyAlpha (SIMD on) 47.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.691x (30.9% faster)
Image modifyAlpha removeColor (SIMD off) 49.000 ms
Image modifyAlpha removeColor (SIMD on) 72.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 1.469x (46.9% slower)

ParparVM vs HotSpot (JDK 25): macOS arm64

Runner CPU: Apple M1 (Virtual) (baseline macos-arm64)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (HelloCodenameOne) 3 0.84x (base 0.96x, -11.8%) 0.89x (base 0.93x, -3.3%) ok
translator (self) 3 0.62x (base 0.62x, +0.1%) 0.75x (base 0.78x, -3.6%) ok
intArithmetic 3 1.06x (base 1.03x, +2.7%) 0.12x (base 0.12x, +1.8%) ok
longArithmetic 3 1.05x (base 1.03x, +2.2%) 0.12x (base 0.07x, +65.0%) ok
mathTranscendental 3 0.96x (base 1.01x, -5.0%) 0.12x (base 0.12x, +1.1%) ok
arraySequential 3 0.48x (base 0.42x, +13.5%) 0.53x (base 0.53x, +1.2%) ok
arrayRandom 3 0.96x (base 0.99x, -2.7%) 0.33x (base 0.32x, +0.4%) ok
objectAllocation 3 0.99x (base 1.11x, -10.9%) 0.66x (base 0.72x, -9.3%) ok
valueEscape 3 0.51x (base 0.51x, +0.3%) 0.09x (base 0.09x, -2.8%) ok
hashMapChurn 3 1.02x (base 1.18x, -12.9%) 0.07x (base 0.07x, -2.0%) ok
stringBuilding 3 0.90x (base 0.84x, +7.3%) 0.40x (base 0.46x, -13.6%) ok
recursion 3 1.29x (base 1.24x, +4.5%) 0.12x (base 0.12x, +1.2%) ok
quicksort 3 1.06x (base 1.01x, +4.6%) 0.11x (base 0.11x, +0.4%) ok

Result: no regression

@shai-almog

shai-almog commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 189 screenshots: 189 matched.
✅ Native iOS Metal screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 1662 seconds

Build and Run Timing

Metric Duration
Simulator Boot 58000 ms
Simulator Boot (Run) 0 ms
App Install 12000 ms
App Launch 1000 ms
Test Execution 422000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 228ms / native 3ms = 76.0x speedup
SIMD float-mul (64K x300) java 290ms / native 3ms = 96.6x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 84.000 ms
Base64 CN1 decode 86.000 ms
Base64 native encode 521.000 ms
Base64 encode ratio (CN1/native) 0.161x (83.9% faster)
Base64 native decode 664.000 ms
Base64 decode ratio (CN1/native) 0.130x (87.0% faster)
Base64 SIMD encode 56.000 ms
Base64 encode ratio (SIMD/CN1) 0.667x (33.3% faster)
Base64 SIMD decode 50.000 ms
Base64 decode ratio (SIMD/CN1) 0.581x (41.9% faster)
Base64 encode ratio (SIMD/native) 0.107x (89.3% faster)
Base64 decode ratio (SIMD/native) 0.075x (92.5% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 4.000 ms
Image createMask (SIMD on) 2.000 ms
Image createMask ratio (SIMD on/off) 0.500x (50.0% faster)
Image applyMask (SIMD off) 29.000 ms
Image applyMask (SIMD on) 17.000 ms
Image applyMask ratio (SIMD on/off) 0.586x (41.4% faster)
Image modifyAlpha (SIMD off) 30.000 ms
Image modifyAlpha (SIMD on) 27.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.900x (10.0% faster)
Image modifyAlpha removeColor (SIMD off) 24.000 ms
Image modifyAlpha removeColor (SIMD on) 17.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.708x (29.2% faster)

@shai-almog

shai-almog commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 188 screenshots: 188 matched.
✅ Native Mac screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 776 seconds

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 74ms / native 5ms = 14.8x speedup
SIMD float-mul (64K x300) java 67ms / native 4ms = 16.7x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 62.000 ms
Base64 CN1 decode 59.000 ms
Base64 native encode 898.000 ms
Base64 encode ratio (CN1/native) 0.069x (93.1% faster)
Base64 native decode 381.000 ms
Base64 decode ratio (CN1/native) 0.155x (84.5% faster)
Base64 SIMD encode 69.000 ms
Base64 encode ratio (SIMD/CN1) 1.113x (11.3% slower)
Base64 SIMD decode 61.000 ms
Base64 decode ratio (SIMD/CN1) 1.034x (3.4% slower)
Base64 encode ratio (SIMD/native) 0.077x (92.3% faster)
Base64 decode ratio (SIMD/native) 0.160x (84.0% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 8.000 ms
Image createMask (SIMD on) 1.000 ms
Image createMask ratio (SIMD on/off) 0.125x (87.5% faster)
Image applyMask (SIMD off) 96.000 ms
Image applyMask (SIMD on) 95.000 ms
Image applyMask ratio (SIMD on/off) 0.990x (1.0% faster)
Image modifyAlpha (SIMD off) 88.000 ms
Image modifyAlpha (SIMD on) 71.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.807x (19.3% faster)
Image modifyAlpha removeColor (SIMD off) 78.000 ms
Image modifyAlpha removeColor (SIMD on) 72.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.923x (7.7% faster)

@shai-almog

shai-almog commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 249 screenshots: 249 matched.
✅ Native Apple Watch (watchOS, Core Graphics) screenshot tests passed.

@shai-almog

shai-almog commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 176 screenshots: 176 matched.
✅ Native iOS Metal screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 2392 seconds

Build and Run Timing

Metric Duration
Simulator Boot 84000 ms
Simulator Boot (Run) 1000 ms
App Install 21000 ms
App Launch 7000 ms
Test Execution 541000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 222ms / native 11ms = 20.1x speedup
SIMD float-mul (64K x300) java 82ms / native 4ms = 20.5x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 55.000 ms
Base64 CN1 decode 55.000 ms
Base64 native encode 707.000 ms
Base64 encode ratio (CN1/native) 0.078x (92.2% faster)
Base64 native decode 332.000 ms
Base64 decode ratio (CN1/native) 0.166x (83.4% faster)
Base64 SIMD encode 75.000 ms
Base64 encode ratio (SIMD/CN1) 1.364x (36.4% slower)
Base64 SIMD decode 56.000 ms
Base64 decode ratio (SIMD/CN1) 1.018x (1.8% slower)
Base64 encode ratio (SIMD/native) 0.106x (89.4% faster)
Base64 decode ratio (SIMD/native) 0.169x (83.1% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 6.000 ms
Image createMask (SIMD on) 2.000 ms
Image createMask ratio (SIMD on/off) 0.333x (66.7% faster)
Image applyMask (SIMD off) 262.000 ms
Image applyMask (SIMD on) 94.000 ms
Image applyMask ratio (SIMD on/off) 0.359x (64.1% faster)
Image modifyAlpha (SIMD off) 42.000 ms
Image modifyAlpha (SIMD on) 129.000 ms
Image modifyAlpha ratio (SIMD on/off) 3.071x (207.1% slower)
Image modifyAlpha removeColor (SIMD off) 365.000 ms
Image modifyAlpha removeColor (SIMD on) 171.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.468x (53.2% faster)

@shai-almog

shai-almog commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 184 screenshots: 184 matched.
✅ Native Apple TV (tvOS, Metal) screenshot tests passed.

@shai-almog
shai-almog merged commit 0910dbb into master Oct 25, 2026
130 of 132 checks passed
@shai-almog
shai-almog deleted the backend-controller-advice branch October 25, 2026 12:41
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.

RFE: Backend controller middleware, validation, and exception mapping

1 participant