Apple M4, 10 cores, AC power · GraalVM 25.1.3 (Java 25.0.3) · OpenJDK 26.0.1 · Gradle daemon JBR 21 · 2026-07-16
Each app self-runs the suite (3 discarded warmups + best-of-5 over 13 CPU kernels, geometric render ramps, a list bench). Strictly sequential, one app at a time; peak RSS sampled during each run. CPU/GFX higher is better; list, RAM and app size lower is better.
JVM (HotSpot / GraalVM JIT)GraalVM native imageNative-UI port
Headline comparison
Composite CPU scorebest-of-5 geo-mean of 13 kernels · higher is better
jvm-graal146.7
tauri142.2
jvm-c2-pg140.4
swiftui138.7
jvm-c2138.5
aot-o3-pgo132.7
aot-o3100.8
aot-o286.9
aot-os80.1
flutter57.3
Peak RAMMB · lower is better · longer = more memory
flutter196 MB
swiftui268 MB
aot-o3-pgo269 MB
aot-o2278 MB
aot-o3297 MB
aot-os326 MB
jvm-c2-pg616 MB
jvm-c2620 MB
jvm-graal695 MB
tauri794 MB
Tauri counts the full WebKit process tree (794 MB); its main process alone is 177 MB.
swiftui/tauri (‡) rely on the OS runtime (SwiftUI/WebKit), so their tiny binaries are not comparable to self-contained bundles.
Summary (sorted by CPU)
variant
runtime
CPU
GFX
list ms
peak RAM
app size
jvm-graal
JVM JIT · Java HotSpot(TM) 64-Bit Server VM 25.0.3
146.7
13041
21.0
695 MB
160 MB
tauri
Rust · rustc release (LLVM -O3) + WebView
142.2
15013
233.0
794 MB †
6 MB‡
jvm-c2-pg
JVM JIT · OpenJDK 64-Bit Server VM 26.0.1
140.4
13041
20.9
616 MB
119 MB
swiftui
Swift · LLVM (release) + SwiftUI
138.7
15254
14.4
268 MB
0.34 MB‡
jvm-c2
JVM JIT · OpenJDK 64-Bit Server VM 26.0.1
138.5
13041
21.6
620 MB
136 MB
aot-o3-pgo
GraalVM Native Image (AOT · -O3)
132.7
13859
17.1
269 MB
129 MB
aot-o3
GraalVM Native Image (AOT · -O3)
100.8
13859
17.1
297 MB
174 MB
aot-o2
GraalVM Native Image (AOT · -O3)
86.9
11239
17.2
278 MB
150 MB
aot-os
GraalVM Native Image (AOT · -O3)
80.1
10433
17.3
326 MB
129 MB
flutter
Dart AOT (Flutter release)
57.3
15133
17.2
196 MB
37 MB
† Tauri RAM = main process + WebKit tree (WebContent/GPU/Networking). ‡ system-runtime port (size not comparable to self-contained bundles).
Per-kernel CPU throughput
Higher is better. Best per row in green. Units per kernel are in the appendix.
kernel
jvm-graal
tauri
jvm-c2-pg
swiftui
jvm-c2
aot-o3-pgo
aot-o3
aot-o2
aot-os
flutter
mandelbrotMpix/s
4.09
4.13
4.33
3.92
3.99
1.98
3.32
1.97
3.27
3.61
nbodyM-inter/s
701
693
640
659
691
695
683
655
678
609
raytracerMrays/s
17.15
19.77
18.94
19.79
19.04
17.45
15.82
14.02
7.04
4.22
matmulMFLOP/s
14217
16224
16690
16215
16724
12225
3877
3244
3105
3054
blurMpix/s
93.35
44.48
59.69
80.70
49.15
91.47
49.52
46.62
36.46
30.01
sha256MB/s
333
442
361
360
362
327
297
295
268
192
sieveMn/s
708
642
566
604
600
726
467
463
484
269
fftMbf/s
408
453
441
437
441
364
370
376
357
367
piMdig/s
0.09
0.11
0.11
0.11
0.10
0.10
0.09
0.09
0.09
0.08
mandelbrot_mtMpix/s
15.47
16.52
15.56
16.12
16.08
14.47
14.06
7.49
12.22
10.55
raytracer_mtMrays/s
74.48
81.20
68.55
74.95
67.20
71.43
60.16
49.88
25.51
13.67
matmul_mtMFLOP/s
62088
69442
64038
33013
63925
60113
19988
17255
15956
9731
blur_mtMpix/s
345
188
244
262
238
286
203
194
155
39.98
Render ramps (max sustained ≥ 55 fps, higher is better)
variant
particles
stars
texts
swiftui
125000
18175
3906
aot-o3
75000
14540
6102
aot-o3-pgo
75000
14540
6102
aot-o2
50000
11632
6102
flutter
50000
18175
9533
jvm-graal
50000
18175
6102
jvm-c2
50000
18175
6102
jvm-c2-pg
50000
18175
6102
aot-os
50000
9306
6102
tauri
25000
18175
18618
Key takeaways
Raw CPU: Graal JIT leads (146.7). The LLVM baselines (tauri 142, swiftui 139) and C2 (138–140) are bunched together. GraalVM native only catches the JVM/LLVM pack with PGO (100.8 → 132.7); without a profile matmul collapses (3877 vs 12225). Os/O2 trail far behind.
Lowest CPU = Flutter (57.3, Dart AOT): raytracer ÷4, weak matmul/sha/sieve — but it compensates with top-tier rendering (GFX 15133).
RAM: Flutter is the leanest (196 MB), ahead of swiftui (268) and GraalVM native (269–326). The JVMs sit at 616–695 MB. Tauri is the worst (794 MB) once the WebKit process tree is counted.
App size: Flutter is the lightest self-contained bundle (37 MB). PGO shrinks the native image (aot-o3 174 → aot-o3-pgo 129 MB). swiftui/tauri look tiny (0.3 / 5.6 MB) but rely on the system runtime, so they are not comparable (‡).
List / startup: native ~17 ms, JVM ~21 ms, swiftui 14 ms (best). Tauri 233 ms — WebView DOM/canvas list rendering, an order of magnitude slower.
Graal compiler signature (JIT and AOT+PGO alike): strong blur/sieve, dull fft/sha. The known PGO regression on mandelbrot reproduces (1.98 with profile vs 3.32 without) — expected.
Sweet spot: aot-o3-pgo — near-JVM CPU (132.7), 2.5× lower RAM (269 MB), compact .app (129 MB), fast startup. The cost: the PGO flow (instrumented build → GUI run → rebuild).
Notes
Tauri RAM — the WebView pitfall. WKWebView is multi-process on macOS: the canvas/JS run in com.apple.WebKit.WebContent/.GPU/.Networking, not the app binary. Main-process RSS alone is 177 MB; the real footprint summing the WebKit tree is 794 MB — making Tauri the heaviest in RAM, not the lightest. (Summing RSS slightly overcounts shared framework pages, so it is an upper bound.)
App size — self-contained vs system runtime. JVM (jlink), GraalVM native and Flutter ship their own runtime, so the .app is the honest weight. swiftui/tauri use the OS's SwiftUI/WebKit, so their binaries (0.3 / 5.6 MB) exclude the engine macOS provides — not comparable. Unlike Electron (~150 MB bundled Chromium), Tauri ships nothing but pays in RAM at runtime.
Flutter. Built after fixing an Xcode ↔ Command Line Tools mismatch (xcodebuild -runFirstLaunch). Port compliant: app-sandbox=false entitlements, top-level isolates.
Appendix — full precise results per benchmark
Exact figures from each variant's result JSON. throughputM = work units / best-of-5 seconds; best (s) = fastest of 5 timed runs after 3 discarded warmups.
jvm-graal — JVM JIT · Java HotSpot(TM) 64-Bit Server VM 25.0.3