Skip to content

Fix the three nightly failures in #6160 - #6172

Merged
shai-almog merged 19 commits into
masterfrom
fix-nightly-6160
Nov 7, 2026
Merged

shai-almog merged 19 commits into
masterfrom
fix-nightly-6160

Conversation

@shai-almog

Copy link
Copy Markdown
Collaborator

Fixes the three items the nightly watchdog reported in #6160.

dash: GameSocketTest hung for 300 s in the generated template. Two runners who never jump are both out 6.4 s into Neon Causeway, so the race ends; the test slept out the countdown before sending the host's jump, leaving it about 6 s to land. A stalled CI container missed that, the server dropped the late jump (correctly: the race was over), and the guest waited for the WebSocket idle close. Reproduced locally by delaying the jump. The jump is now sent during the countdown (stamped for tick INPUT_DELAY), the sockets get a 30 s read timeout, and the race ending first fails by name. The stamping of a mid-race jump is now held by OnlineRaceTest on a driven clock. Initializr template regenerated.

flutter-bench: JavaScript code size +17.5%. From #6163, which reads instance fields as o.name instead of through the o[_qN] alias table (valueEscape 20% faster). The gallery's wire bytes in the same run moved +0.03%. Rebaselined in pr/6172.json with that reason.

nightly-watchdog: ios-accessibility-thread.yml "no scheduled run in 30 hours". Its cron arrived with #6128 after that night's slot. A suite with no scheduled run at all whose file reached master inside the window is now listed as awaiting its first run (keeps the issue open, own heading); one that ran before and went quiet is still reported.

🤖 Generated with Claude Code

dash: GameSocketTest slept out the countdown and then sent the host's
jump. Two runners who never jump are both out 6.4 s into Neon Causeway,
the race ends, and a later jump is dropped, so the jump had about 6 s
to land; a stalled CI container missed that and the guest waited for
the server's 300 s idle close (reproduced by delaying the jump). The
jump is now sent during the countdown, which the server stamps for tick
INPUT_DELAY, a read timeout fails a missing frame in 30 s, and the race
ending first is reported by name. OnlineRaceTest now holds the stamping
of a mid-race jump on a driven clock, which the socket test no longer
exercises. RaceRoom.intent's doc no longer says a countdown input is
dropped. The Initializr template is regenerated.

flutter-bench: the JavaScript code size moved +17.5% with #6163, whose
emitter reads instance fields as o.name instead of through the o[_qN]
alias table (valueEscape 20% faster). The gallery's wire bytes in the
same run moved +0.03%. Rebaselined with that reason.

nightly-watchdog: ios-accessibility-thread joined the nightly in #6128,
merged after that night's slot, and was reported as a schedule that
stopped firing. A suite with no scheduled run at all whose file reached
master inside the window is now listed as awaiting its first run, which
keeps the issue open; one that ran before and went quiet is still a
problem.

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

github-actions Bot commented Nov 5, 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)

@github-actions

github-actions Bot commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

Cloudflare Preview

@github-actions

github-actions Bot commented Nov 5, 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)
    • ✅ compose-compat: 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)
    • ✅ python-runtime: 0 findings (no issues)
    • ✅ python-transpiler: 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 Nov 5, 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.51, 1.82, 1.65

Metric Codename One Flutter Ratio Winner
Installed size 78.4 MB 95.8 MB 1.22x Codename One
Executable code 5.1 MB 20.6 MB 4.01x Codename One
Download size (zipped) 78.4 MB 95.8 MB 1.22x Codename One
Cold start to first frame on screen 392 ms 1583 ms 4.18x Codename One
Memory at rest 48.5 MB 79.5 MB 1.64x 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 96 ms 189 ms 1.97x
longArithmetic 58 ms 59 ms 1.02x
mathTranscendental 228 ms 350 ms 1.53x
arraySequential 27 ms 35 ms 1.30x
arrayRandom 401 ms 487 ms 1.21x
objectAllocation 67 ms 48 ms 0.72x
valueEscape 7 ms 7 ms 1.00x
hashMapChurn 141 ms 291 ms 2.06x
stringBuilding 98 ms 128 ms 1.31x
recursion 83 ms 274 ms 3.30x
quicksortBench 130 ms 153 ms 1.18x
Geometric mean 1.39x

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 23.72, 22.83, 20.7

Metric Codename One Flutter Ratio Winner
Installed size 108.2 MB 110.5 MB 1.02x Codename One
Executable code 17.2 MB 19.1 MB 1.11x Codename One
Download size (zipped) 80.1 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 -11.70% -- 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 6172 --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 1.9, 1.11, 0.46

Metric Codename One Flutter Ratio Winner
Installed size 107.6 MB 122.5 MB 1.14x Codename One
Executable code 16.5 MB 25.2 MB 1.52x Codename One
Download size (zipped) 76.6 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 465 ms wrong result Flutter: wrong result
longArithmetic 2754 ms did not run Flutter: did not run
mathTranscendental 252 ms did not run Flutter: did not run
arraySequential 101 ms 56 ms 0.55x
arrayRandom 363 ms wrong result Flutter: wrong result
objectAllocation 16 ms 15 ms 0.94x
valueEscape 78 ms 5 ms 0.06x
hashMapChurn 460 ms 149 ms 0.32x
stringBuilding 70 ms 63 ms 0.90x
recursion 267 ms 247 ms 0.93x
quicksortBench 252 ms wrong result Flutter: wrong result
Geometric mean 0.46x

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.49, 2.94, 2.37

Metric Codename One Flutter Ratio Winner
Installed size 113.5 MB 143.8 MB 1.27x Codename One
Executable code 15.9 MB 16.1 MB 1.01x Codename One
Download size (zipped) 81.9 MB 92.9 MB 1.13x Codename One
Cold start to first frame on screen 153 ms 187 ms 1.22x Codename One
Memory at rest 92.8 MB 226.0 MB 2.44x 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 77 ms 208 ms 2.70x
longArithmetic 52 ms 55 ms 1.06x
mathTranscendental 168 ms 175 ms 1.04x
arraySequential 13 ms 36 ms 2.77x
arrayRandom 260 ms 285 ms 1.10x
objectAllocation 21 ms 35 ms 1.67x
valueEscape 4 ms 11 ms 2.75x
hashMapChurn 35 ms 232 ms 6.63x
stringBuilding 25 ms 100 ms 4.00x
recursion 83 ms 204 ms 2.46x
quicksortBench 143 ms 142 ms 0.99x
Geometric mean 2.05x

Gate: within tolerance against scripts/flutter-bench/baseline. Smaller than its baseline, which does not fail the gate: Executable code -10.85%; Installed size -2.24% -- 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 6172 --reason "<why these moved>" baseline-linux.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.

macos

9 interleaved rounds; host load 1.68, 12.04, 17.59

Metric Codename One Flutter Ratio Winner
Installed size 123.8 MB 139.4 MB 1.13x Codename One
Executable code 32.7 MB 47.9 MB 1.47x Codename One
Download size (zipped) 85.9 MB 93.3 MB 1.09x Codename One
Cold start to first frame on screen 370 ms 532 ms 1.57x Codename One
Memory at rest 34.7 MB 53.2 MB 1.53x 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 124 ms 285 ms 2.30x
longArithmetic 79 ms 77 ms 0.97x
mathTranscendental 319 ms 323 ms 1.01x
arraySequential 11 ms 43 ms 3.91x
arrayRandom 330 ms 361 ms 1.09x
objectAllocation 118 ms 30 ms 0.25x
valueEscape 6 ms 14 ms 2.33x
hashMapChurn 44 ms 206 ms 4.68x
stringBuilding 35 ms 108 ms 3.09x
recursion 163 ms 280 ms 1.72x
quicksortBench 122 ms 154 ms 1.26x
Geometric mean 1.60x

Gate: within tolerance against scripts/flutter-bench/baseline. Smaller than its baseline, which does not fail the gate: Executable code -12.94%; Installed size -3.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 6172 --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 108.0 MB 121.1 MB 1.12x Codename One
Executable code 11.5 MB 14.1 MB 1.23x Codename One
Download size (zipped) 78.2 MB 86.4 MB 1.10x Codename One
Cold start to first frame on screen 157 ms 247 ms 1.57x Codename One
Memory at rest 58.7 MB 93.1 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 84 ms 184 ms 2.19x
longArithmetic 60 ms 57 ms 0.95x
mathTranscendental 197 ms 280 ms 1.42x
arraySequential 12 ms 35 ms 2.92x
arrayRandom 250 ms 295 ms 1.18x
objectAllocation 25 ms 39 ms 1.56x
valueEscape 1 ms 7 ms 7.00x
hashMapChurn 47 ms 338 ms 7.19x
stringBuilding 35 ms 122 ms 3.49x
recursion 202 ms 266 ms 1.32x
quicksortBench 145 ms 147 ms 1.01x
Geometric mean 2.11x

Gate: within tolerance against scripts/flutter-bench/baseline. Smaller than its baseline, which does not fail the gate: Executable code -12.08% -- 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 6172 --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 and others added 2 commits November 5, 2026 20:29
…ranspiler PR

#6154 merged a transpiler under which the Flutter gallery (the Flutter
benchmark's application) no longer compiled, and nothing on its PR ran it:
flutter-bench.yml runs on a PR only when its own tree changes. Every
benchmark leg of every PR since then failed in javac.

Fixed, each where it went wrong:
- a library-private class's static tear-off (`_DialogDemoState::_route`) was
  taken for a bound one and handed the class name as a receiver;
- a function-type witness nested in another reused its lambda parameter;
- an explicit `<num>` on a call whose parameter is `Comparable<T>` was written
  as `<Number>`, which no Long or Double satisfies;
- named arguments did not bind a generic function's type parameters, so
  `ease(begin: radius, end: 0)` emitted `0` as a long;
- List<E>.generate's generator had no E-typed return context;
- `double + (c ? x : 0)` took the Number arms of a num slot;
- the restorablePush stubs declared their route builder Object, and
  ScrollNotification's depth getter did not follow its siblings' naming.

flutter-gallery-compile.yml runs the benchmark's own path up to javac
(prepare.sh, then the generated project's compile) on every change to the
transpiler, the runtimes or the Flutter build steps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The gallery compiles again with this PR, so this is its first measurement
under #6154's transpiler: code and install grow 1,208,552 bytes while
wire_bytes moves +0.22%.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

shai-almog commented Nov 5, 2026 •

Copy link
Copy Markdown
Collaborator Author

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

@shai-almog

shai-almog commented Nov 5, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 195 screenshots: 195 matched.

Native Android coverage

  • 📊 Line coverage: 19.17% (56155/292885 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 18.13% (270508/1492353), branch 12.38% (19670/158943), complexity 10.35% (15842/153017), method 15.73% (11409/72518), class 27.93% (2247/8045)
    • Lowest covered classes
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2396 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • androidx.compose.runtime.androidx.compose.runtime.LinkComposer – 0.00% (0/1430 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlinx.coroutines.channels.kotlinx.coroutines.channels.BufferedChannel – 0.00% (0/863 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/744 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/630 lines covered)
      • com.codename1.androidcompat.rt.com.codename1.androidcompat.rt.TextXmlPullParser – 0.00% (0/623 lines covered)

✅ Native Android screenshot tests passed.

Native Android coverage

  • 📊 Line coverage: 19.17% (56155/292885 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 18.13% (270508/1492353), branch 12.38% (19670/158943), complexity 10.35% (15842/153017), method 15.73% (11409/72518), class 27.93% (2247/8045)
    • Lowest covered classes
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2396 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • androidx.compose.runtime.androidx.compose.runtime.LinkComposer – 0.00% (0/1430 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlinx.coroutines.channels.kotlinx.coroutines.channels.BufferedChannel – 0.00% (0/863 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/744 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/630 lines covered)
      • com.codename1.androidcompat.rt.com.codename1.androidcompat.rt.TextXmlPullParser – 0.00% (0/623 lines covered)

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend scalar fallback (no native SIMD)
SIMD int-add (64K x300) java 66ms / native 32ms = 2.0x speedup
SIMD float-mul (64K x300) java 64ms / native 50ms = 1.2x 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 39.000 ms
Base64 CN1 decode 43.000 ms
Base64 native encode 318.000 ms
Base64 encode ratio (CN1/native) 0.123x (87.7% faster)
Base64 native decode 157.000 ms
Base64 decode ratio (CN1/native) 0.274x (72.6% faster)
Image encode benchmark status skipped (SIMD unsupported)

shai-almog and others added 5 commits November 5, 2026 21:43
#6154's FunctionType and TypeWitness split type-variable lists with
String.split, which is in neither vm/JavaAPI nor Ports/CLDC11: the JVM
legs pass and the native Linux and Windows translations fail to compile
an undeclared java_lang_String_split. DartUri and ContentType had the
same call. All four now split on a literal by hand.

Also rebaselines the Android gallery's dex size for #6154's code
generation; the APK itself moved +0.21%.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ation

Both native galleries build again now that the Dart runtime no longer
calls String.split; code grows about 11% on each while the gallery's
wire size moves under 1%.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The gallery now transpiles and compiles inside Maven's JVM under #6154's
larger output, and the macOS runner's default quarter of 7 GB ran out in
jar packaging on the iOS leg.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Both now build with the 4 GB heap; code grows about 11% on each while
wire size moves under 1.5%.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CityRunTest, PartyTest, PromoVideoTest and driveToBusy called driveFor
in a loop of 100-200 ms windows. Each call removed the bot's hook when
it returned, so the game ticked unsteered between calls, and on a slow
CI runner the city run crashed in one of those gaps before its first
landmark ("still running at the landmark"). driveUntil keeps one bot
on the controls until the condition holds, the run ends or time is up.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

shai-almog commented Nov 6, 2026 •

Copy link
Copy Markdown
Collaborator Author

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

Benchmark Results

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

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 55ms / native 3ms = 18.3x speedup
SIMD float-mul (64K x300) java 52ms / native 3ms = 17.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 active (NEON-accelerated)
Base64 CN1 encode 42.000 ms
Base64 CN1 decode 53.000 ms
Image encode benchmark iterations 100
Image createMask (SIMD off) 9.000 ms
Image createMask (SIMD on) 7.000 ms
Image createMask ratio (SIMD on/off) 0.778x (22.2% faster)
Image applyMask (SIMD off) 70.000 ms
Image applyMask (SIMD on) 88.000 ms
Image applyMask ratio (SIMD on/off) 1.257x (25.7% slower)
Image modifyAlpha (SIMD off) 71.000 ms
Image modifyAlpha (SIMD on) 62.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.873x (12.7% faster)
Image modifyAlpha removeColor (SIMD off) 78.000 ms
Image modifyAlpha removeColor (SIMD on) 64.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.821x (17.9% faster)

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 1.16x (base 0.96x, +21.4%) 0.89x (base 0.93x, -3.7%) ok
translator (self) 3 0.67x (base 0.62x, +8.2%) 0.81x (base 0.78x, +4.0%) ok
intArithmetic 3 1.04x (base 1.03x, +0.8%) 0.12x (base 0.12x, +1.2%) ok
longArithmetic 3 1.07x (base 1.03x, +4.1%) 0.11x (base 0.07x, +62.8%) ok
mathTranscendental 3 1.01x (base 1.01x, +0.6%) 0.12x (base 0.12x, +0.6%) ok
arraySequential 3 0.45x (base 0.42x, +6.5%) 0.53x (base 0.53x, +0.2%) ok
arrayRandom 3 0.97x (base 0.99x, -2.3%) 0.32x (base 0.32x, +0.3%) ok
objectAllocation 3 1.07x (base 1.11x, -3.0%) 0.78x (base 0.72x, +7.2%) ok
valueEscape 3 0.51x (base 0.51x, +1.3%) 0.09x (base 0.09x, +3.0%) ok
hashMapChurn 3 1.10x (base 1.18x, -6.5%) 0.07x (base 0.07x, +7.2%) ok
stringBuilding 3 0.89x (base 0.84x, +5.7%) 0.46x (base 0.46x, +0.3%) ok
recursion 3 1.23x (base 1.24x, -0.1%) 0.12x (base 0.12x, +1.0%) ok
quicksort 3 0.99x (base 1.01x, -2.6%) 0.11x (base 0.11x, +1.0%) ok

Result: no regression

@shai-almog

shai-almog commented Nov 6, 2026 •

Copy link
Copy Markdown
Collaborator Author

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

@shai-almog

shai-almog commented Nov 6, 2026 •

Copy link
Copy Markdown
Collaborator Author

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

Benchmark Results

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

Build and Run Timing

Metric Duration
Simulator Boot 84000 ms
Simulator Boot (Run) 1000 ms
App Install 18000 ms
App Launch 10000 ms
Test Execution 587000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 285ms / native 3ms = 95.0x speedup
SIMD float-mul (64K x300) java 87ms / native 11ms = 7.9x 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 60.000 ms
Base64 CN1 decode 106.000 ms
Base64 native encode 1797.000 ms
Base64 encode ratio (CN1/native) 0.033x (96.7% faster)
Base64 native decode 622.000 ms
Base64 decode ratio (CN1/native) 0.170x (83.0% faster)
Base64 SIMD encode 75.000 ms
Base64 encode ratio (SIMD/CN1) 1.250x (25.0% slower)
Base64 SIMD decode 73.000 ms
Base64 decode ratio (SIMD/CN1) 0.689x (31.1% faster)
Base64 encode ratio (SIMD/native) 0.042x (95.8% faster)
Base64 decode ratio (SIMD/native) 0.117x (88.3% 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) 51.000 ms
Image applyMask (SIMD on) 129.000 ms
Image applyMask ratio (SIMD on/off) 2.529x (152.9% slower)
Image modifyAlpha (SIMD off) 205.000 ms
Image modifyAlpha (SIMD on) 118.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.576x (42.4% faster)
Image modifyAlpha removeColor (SIMD off) 224.000 ms
Image modifyAlpha removeColor (SIMD on) 364.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 1.625x (62.5% slower)

@shai-almog

shai-almog commented Nov 6, 2026 •

Copy link
Copy Markdown
Collaborator Author

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

@shai-almog

shai-almog commented Nov 6, 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: 928 seconds

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 66ms / native 7ms = 9.4x speedup
SIMD float-mul (64K x300) java 54ms / native 3ms = 18.0x 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 52.000 ms
Base64 CN1 decode 54.000 ms
Base64 native encode 1045.000 ms
Base64 encode ratio (CN1/native) 0.050x (95.0% faster)
Base64 native decode 378.000 ms
Base64 decode ratio (CN1/native) 0.143x (85.7% faster)
Base64 SIMD encode 52.000 ms
Base64 encode ratio (SIMD/CN1) 1.000x (0.0% slower)
Base64 SIMD decode 45.000 ms
Base64 decode ratio (SIMD/CN1) 0.833x (16.7% faster)
Base64 encode ratio (SIMD/native) 0.050x (95.0% faster)
Base64 decode ratio (SIMD/native) 0.119x (88.1% faster)
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) 68.000 ms
Image applyMask (SIMD on) 72.000 ms
Image applyMask ratio (SIMD on/off) 1.059x (5.9% slower)
Image modifyAlpha (SIMD off) 79.000 ms
Image modifyAlpha (SIMD on) 70.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.886x (11.4% faster)
Image modifyAlpha removeColor (SIMD off) 90.000 ms
Image modifyAlpha removeColor (SIMD on) 80.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.889x (11.1% faster)

#6154 gave the Flutter gallery 340 new classes, 320 of them in DartFnSigs:
a bridge class and a static factory for every signed SAM whether or not a
call site used it (105 bridges, 18 used), and an interface per signature
even where one SAM was its only carrier. Each is a class in the native
executable, which put Linux's code behind Flutter's. Only the members a
generated file names are emitted now, and a signature with a single carrier
is written into that SAM. Subclass const keys share ConstCanon.join instead
of inlining the concatenation into every keyed class.

Gallery: 904 -> 715 generated classes, 3.70 -> 3.45 MB of class files.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

shai-almog commented Nov 6, 2026 •

Copy link
Copy Markdown
Collaborator Author

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

Benchmark Results

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

Build and Run Timing

Metric Duration
Simulator Boot 130000 ms
Simulator Boot (Run) 3000 ms
App Install 23000 ms
App Launch 62000 ms
Test Execution 505000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 145ms / native 3ms = 48.3x speedup
SIMD float-mul (64K x300) java 137ms / native 14ms = 9.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 119.000 ms
Base64 CN1 decode 166.000 ms
Base64 native encode 2013.000 ms
Base64 encode ratio (CN1/native) 0.059x (94.1% faster)
Base64 native decode 1617.000 ms
Base64 decode ratio (CN1/native) 0.103x (89.7% faster)
Base64 SIMD encode 129.000 ms
Base64 encode ratio (SIMD/CN1) 1.084x (8.4% slower)
Base64 SIMD decode 50.000 ms
Base64 decode ratio (SIMD/CN1) 0.301x (69.9% faster)
Base64 encode ratio (SIMD/native) 0.064x (93.6% faster)
Base64 decode ratio (SIMD/native) 0.031x (96.9% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 24.000 ms
Image createMask (SIMD on) 5.000 ms
Image createMask ratio (SIMD on/off) 0.208x (79.2% faster)
Image applyMask (SIMD off) 993.000 ms
Image applyMask (SIMD on) 52.000 ms
Image applyMask ratio (SIMD on/off) 0.052x (94.8% faster)
Image modifyAlpha (SIMD off) 487.000 ms
Image modifyAlpha (SIMD on) 67.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.138x (86.2% faster)
Image modifyAlpha removeColor (SIMD off) 109.000 ms
Image modifyAlpha removeColor (SIMD on) 78.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.716x (28.4% faster)

shai-almog and others added 4 commits November 6, 2026 10:32
Measured on the gallery's Linux executable, built in a container with the
same toolchain on both sides: 15.30 MB before #6154, 17.00 MB after it,
16.40 MB with this change.

- A statically typed num.clamp went through Dyn.call, which made every
  builtin's dynamic dispatch reachable (178 KB for four clamps). It calls
  Dyn.numClamp directly, and invoking a callable object takes a path that
  reaches only transpiled objects (Dyn.objectCall), not List/Map/String.
- Each class of a library with renamed private names registered the whole
  library's spellings from a static initializer of its own. They are
  registered once, from FlutterRegistry.invokeMain, one packed literal per
  library; the behavior harness enters through invokeMain as an app does.
- An enum builds its Dart-name table only when a value was renamed for Java.
- $constKey() is kept only for classes constructed as constants and their
  superclasses (64 of 278 in the gallery).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A lambda becomes an instance of a carrier -- one class per functional
interface and capture shape -- holding a function address and its captures.
Brought over from the python-hero-ports work; on the Flutter gallery it cuts
268 KB of native code.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The frameless path rejected any custom instruction, and FunctionAddress --
a constant push -- is the one every lambda factory has, so all 2,080 of the
Flutter gallery's factories got a full frame. -103 KB.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CN1_FAST_NEW expanded the always_inline bump allocator at all 9,951 NEW sites
of the Flutter gallery: 894 KB of a 16.0 MB executable. cn1BibopFastNew is
the same path behind one direct call. Interleaved vm/benchmarks A/B against
-DCN1_INLINE_ALLOC_SITES: geomean 1.004, objectAllocation 1.009, checksums
identical.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

shai-almog commented Nov 6, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 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 43ms / native 3ms = 14.3x speedup
SIMD float-mul (64K x300) java 44ms / native 2ms = 22.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 77.000 ms
Base64 SIMD encode 86.000 ms
Base64 encode ratio (SIMD/CN1) 1.433x (43.3% slower)
Base64 SIMD decode 77.000 ms
Base64 decode ratio (SIMD/CN1) 1.000x (0.0% slower)
Image encode benchmark iterations 100
Image createMask (SIMD off) 6.000 ms
Image createMask (SIMD on) 1.000 ms
Image createMask ratio (SIMD on/off) 0.167x (83.3% faster)
Image applyMask (SIMD off) 23.000 ms
Image applyMask (SIMD on) 22.000 ms
Image applyMask ratio (SIMD on/off) 0.957x (4.3% faster)
Image modifyAlpha (SIMD off) 23.000 ms
Image modifyAlpha (SIMD on) 13.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.565x (43.5% faster)
Image modifyAlpha removeColor (SIMD off) 26.000 ms
Image modifyAlpha removeColor (SIMD on) 19.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.731x (26.9% faster)

ParparVM vs HotSpot (JDK 25): Windows x64

Runner CPU: AMD64 Family 25 Model 17 Stepping 1, AuthenticAMD (baseline windows-x64@amd64-family-25-model-17-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.79x (base 1.38x, +29.9%) 0.71x (base 0.82x, -12.6%) ok
translator (self) 4 0.87x (base 0.89x, -2.1%) 0.50x (base 0.55x, -9.6%) ok
intArithmetic 4 1.10x (base 1.10x, +0.4%) 0.06x (base 0.06x, -0.8%) ok
longArithmetic 4 1.08x (base 1.08x, -0.0%) 0.06x (base 0.06x, +1.2%) ok
mathTranscendental 4 0.85x (base 0.85x, +0.5%) 0.06x (base 0.06x, +4.7%) ok
arraySequential 4 1.81x (base 1.72x, +5.4%) 0.38x (base 0.38x, +0.3%) ok
arrayRandom 4 1.02x (base 1.01x, +0.3%) 0.23x (base 0.23x, +0.8%) ok
objectAllocation 4 1.26x (base 1.25x, +0.2%) 0.30x (base 0.29x, +1.5%) ok
valueEscape 4 0.10x (base 0.10x, -1.4%) 0.05x (base 0.04x, +3.9%) ok
hashMapChurn 4 1.29x (base 1.39x, -7.0%) 0.10x (base 0.10x, +2.9%) ok
stringBuilding 4 1.39x (base 1.36x, +2.7%) 0.32x (base 0.28x, +15.8%) ok
recursion 4 1.38x (base 1.43x, -3.4%) 0.06x (base 0.06x, +3.4%) ok
quicksort 4 1.11x (base 1.11x, -0.4%) 0.12x (base 0.12x, +0.8%) ok

Result: no regression

@shai-almog

shai-almog commented Nov 6, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 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 26ms / native 2ms = 13.0x speedup
SIMD float-mul (64K x300) java 26ms / native 3ms = 8.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 gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 41.000 ms
Base64 CN1 decode 47.000 ms
Base64 SIMD encode 51.000 ms
Base64 encode ratio (SIMD/CN1) 1.244x (24.4% slower)
Base64 SIMD decode 46.000 ms
Base64 decode ratio (SIMD/CN1) 0.979x (2.1% faster)
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) 12.000 ms
Image applyMask (SIMD on) 10.000 ms
Image applyMask ratio (SIMD on/off) 0.833x (16.7% faster)
Image modifyAlpha (SIMD off) 17.000 ms
Image modifyAlpha (SIMD on) 11.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.647x (35.3% faster)
Image modifyAlpha removeColor (SIMD off) 16.000 ms
Image modifyAlpha removeColor (SIMD on) 7.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.438x (56.3% faster)

@shai-almog

shai-almog commented Nov 6, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 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 51ms / native 2ms = 25.5x speedup
SIMD float-mul (64K x300) java 49ms / native 2ms = 24.5x 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 62.000 ms
Base64 CN1 decode 67.000 ms
Base64 SIMD encode 75.000 ms
Base64 encode ratio (SIMD/CN1) 1.210x (21.0% slower)
Base64 SIMD decode 68.000 ms
Base64 decode ratio (SIMD/CN1) 1.015x (1.5% slower)
Image encode benchmark iterations 100
Image createMask (SIMD off) 5.000 ms
Image createMask (SIMD on) 1.000 ms
Image createMask ratio (SIMD on/off) 0.200x (80.0% faster)
Image applyMask (SIMD off) 17.000 ms
Image applyMask (SIMD on) 15.000 ms
Image applyMask ratio (SIMD on/off) 0.882x (11.8% faster)
Image modifyAlpha (SIMD off) 17.000 ms
Image modifyAlpha (SIMD on) 9.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.529x (47.1% faster)
Image modifyAlpha removeColor (SIMD off) 27.000 ms
Image modifyAlpha removeColor (SIMD on) 14.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.519x (48.1% 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.46x (base 1.45x, +1.2%) 0.77x (base 0.75x, +1.8%) ok
translator (self) 4 0.92x (base 0.84x, +10.0%) 0.48x (base 0.51x, -4.2%) ok
intArithmetic 4 1.04x (base 1.04x, -0.0%) 0.06x (base 0.06x, +3.6%) ok
longArithmetic 4 0.79x (base 0.80x, -0.0%) 0.06x (base 0.06x, +3.8%) ok
mathTranscendental 4 0.75x (base 0.72x, +3.6%) 0.07x (base 0.06x, +2.2%) ok
arraySequential 4 0.37x (base 0.46x, -18.0%) 0.39x (base 0.39x, +0.0%) ok
arrayRandom 4 0.94x (base 0.94x, +0.2%) 0.23x (base 0.23x, +0.9%) ok
objectAllocation 4 1.77x (base 1.82x, -2.8%) 0.32x (base 0.43x, -26.6%) ok
valueEscape 4 0.76x (base 0.76x, +0.1%) 0.05x (base 0.05x, +3.1%) ok
hashMapChurn 4 1.00x (base 0.98x, +1.4%) 0.12x (base 0.12x, -3.1%) ok
stringBuilding 4 1.55x (base 1.43x, +8.4%) 0.27x (base 0.27x, +0.1%) ok
recursion 4 1.42x (base 1.46x, -2.8%) 0.07x (base 0.07x, +1.6%) ok
quicksort 4 1.01x (base 1.00x, +0.7%) 0.12x (base 0.12x, +0.8%) ok

Result: no regression

@github-actions

github-actions Bot commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

✅ ByteCodeTranslator Quality Report

Test & Coverage

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

Benchmark Results

  • Execution Time: 9755 ms

  • Hotspots (Top 20 sampled methods):

    • 11.42% java.lang.System.identityHashCode (165 samples)
    • 7.89% java.util.ArrayList.indexOf (114 samples)
    • 5.40% java.lang.Object.hashCode (78 samples)
    • 3.39% com.codename1.tools.translator.BytecodeMethod.equals (49 samples)
    • 3.25% java.lang.StringBuilder.append (47 samples)
    • 2.35% com.codename1.tools.translator.bytecodes.Invoke.resolveDirectTarget (34 samples)
    • 2.08% com.codename1.tools.translator.JavascriptReachability.enqueueResolved (30 samples)
    • 1.87% java.util.HashMap.putVal (27 samples)
    • 1.87% java.lang.String.equals (27 samples)
    • 1.45% java.util.HashMap.hash (21 samples)
    • 1.45% java.util.AbstractCollection.containsAll (21 samples)
    • 1.38% java.io.FileOutputStream.writeBytes (20 samples)
    • 1.38% com.codename1.tools.translator.ByteCodeClass.fillVirtualMethodTable (20 samples)
    • 1.31% com.codename1.tools.translator.BytecodeMethod.updateInlinableFieldDependencies (19 samples)
    • 1.31% java.util.Collections$EmptySet.containsAll (19 samples)
    • 1.18% com.codename1.tools.translator.Parser.cullMethods (17 samples)
    • 1.18% java.lang.StringCoding.encode (17 samples)
    • 1.04% com.codename1.tools.translator.classfile.analysis.Frame.execute (15 samples)
    • 1.04% com.codename1.tools.translator.ByteCodeClass.hasDeclaredMethod (15 samples)
    • 0.97% com.codename1.tools.translator.bytecodes.Invoke.findMethodUp (14 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 Nov 6, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 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: Intel(R) Xeon(R) 6973P-C (baseline linux-x64@intel-xeon-6973p-c)

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 1.11x (base 0.98x, +13.4%) 0.82x (base 0.93x, -12.1%) ok
translator (self) 4 0.65x (base 0.66x, -1.3%) 0.46x (base 0.47x, -1.1%) ok
intArithmetic 4 1.01x (base 1.01x, +0.2%) 0.04x (base 0.05x, -29.6%) ok
longArithmetic 4 1.06x (base 1.07x, -0.3%) 0.04x (base 0.06x, -31.1%) ok
mathTranscendental 4 1.03x (base 1.03x, +0.3%) 0.04x (base 0.06x, -28.6%) ok
arraySequential 4 2.12x (base 2.13x, -0.3%) 0.36x (base 0.36x, +1.0%) ok
arrayRandom 4 1.00x (base 1.01x, -1.3%) 0.20x (base 0.21x, -3.3%) ok
objectAllocation 4 1.88x (base 1.94x, -3.2%) 0.32x (base 0.38x, -16.4%) ok
valueEscape 4 0.13x (base 0.13x, +2.7%) 0.03x (base 0.05x, -38.6%) ok
hashMapChurn 4 1.01x (base 1.02x, -1.1%) 0.11x (base 0.10x, +10.1%) ok
stringBuilding 4 1.57x (base 1.66x, -5.5%) 0.26x (base 0.22x, +18.2%) ok
recursion 4 1.36x (base 1.30x, +4.3%) 0.04x (base 0.07x, -47.7%) ok
quicksort 4 1.05x (base 1.10x, -4.7%) 0.10x (base 0.13x, -22.6%) ok

Result: no regression

@shai-almog

shai-almog commented Nov 6, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 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 1.11x (base 1.02x, +8.3%) 0.76x (base 0.66x, +15.6%) ok
translator (self) 4 0.75x (base 0.70x, +6.9%) 0.44x (base 0.43x, +3.0%) ok
intArithmetic 4 1.04x (base 1.04x, -0.1%) 0.03x (base 0.03x, +4.9%) ok
longArithmetic 4 0.79x (base 0.79x, -0.1%) 0.03x (base 0.03x, +5.4%) ok
mathTranscendental 4 1.09x (base 1.10x, -0.3%) 0.04x (base 0.03x, +9.5%) ok
arraySequential 4 0.40x (base 0.36x, +9.2%) 0.37x (base 0.37x, +0.2%) ok
arrayRandom 4 0.94x (base 0.94x, +0.1%) 0.20x (base 0.20x, +0.5%) ok
objectAllocation 4 1.98x (base 1.77x, +12.1%) 0.40x (base 0.37x, +9.4%) ok
valueEscape 4 0.51x (base 0.51x, -0.1%) 0.03x (base 0.03x, +5.9%) ok
hashMapChurn 4 0.84x (base 0.84x, -0.0%) 0.12x (base 0.12x, +0.0%) ok
stringBuilding 4 1.48x (base 1.57x, -5.3%) 0.26x (base 0.26x, +0.4%) ok
recursion 4 1.41x (base 1.43x, -1.7%) 0.04x (base 0.04x, +2.9%) ok
quicksort 4 0.99x (base 0.99x, +0.1%) 0.10x (base 0.09x, +2.8%) ok

Result: no regression

shai-almog and others added 5 commits November 7, 2026 06:49
Lowering lambdas to shared carriers made translating HelloCodenameOne
cheaper on both runtimes; ParparVM got faster, JDK 25 faster still, so the
ratio moved without a VM regression. Measurements are in the row's reason.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…heck

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ration

Every run since the gallery compiles again measured 0.76-0.85 (still faster
than Flutter); the commits here do not move start-up. Evidence in the row.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Dash and Skirmish online tests asserted wall-clock totals (360 ticks in
30 s, 100 server ticks in 30 s), so a runner shared with a dozen other jobs
failed them while the game was still ticking. They now fail only when the
ticks stop for 10 s, which is the stall they were written to catch.

The site search test ran against wrangler pages dev, whose workerd exits when
Chromium resets a connection on navigation; settling first (#6092) did not
stop it. Search is static files only, so it now runs against a plain file
server; the redirect checks keep the Pages runtime.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog
shai-almog merged commit 2f8908c into master Nov 7, 2026
@shai-almog
shai-almog deleted the fix-nightly-6160 branch November 7, 2026 16:11
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