From bf2f9391dba9d2e1dc923ee779b115c80069f69c Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sun, 21 Jun 2026 20:17:30 +0300 Subject: [PATCH] Blog: 'not a JVM' SIMD/stack-allocation deep dive + syndicate_force + mermaid loader fix Wednesday deep dive on adding aligned arrays, stack allocation and portable SIMD to Java by compiling to C instead of running on a JVM, with real CI benchmark numbers, an escape-analysis / cold-client-code section, and the honest 'measure handcrafted SIMD against an -O2 compiler' lesson. Also hardens the shared mermaid shortcode: the loader is a dynamically-injected ES module that runs after DOMContentLoaded, so mermaid's startOnLoad listener never fired; render explicitly with mermaid.run() instead (verified in Chromium and WebKit). Adds an opt-in syndicate_force front-matter flag so this non-Friday post can join the DZone/Foojay rotation. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../blog/not-a-jvm-simd-stack-allocation.md | 105 ++++++++++++++++++ docs/website/layouts/shortcodes/mermaid.html | 10 +- .../blog/not-a-jvm-simd-stack-allocation.jpg | Bin 0 -> 109714 bytes scripts/website/languagetool-accept-blog.txt | 5 + scripts/website/queue_browser_syndication.py | 38 +++++-- scripts/website/syndicate_browser_posts.py | 13 ++- 6 files changed, 160 insertions(+), 11 deletions(-) create mode 100644 docs/website/content/blog/not-a-jvm-simd-stack-allocation.md create mode 100644 docs/website/static/blog/not-a-jvm-simd-stack-allocation.jpg diff --git a/docs/website/content/blog/not-a-jvm-simd-stack-allocation.md b/docs/website/content/blog/not-a-jvm-simd-stack-allocation.md new file mode 100644 index 0000000000..9a4d650717 --- /dev/null +++ b/docs/website/content/blog/not-a-jvm-simd-stack-allocation.md @@ -0,0 +1,105 @@ +--- +title: "We're Not a JVM, and That's How We Got SIMD and Stack Allocation into Java" +slug: not-a-jvm-simd-stack-allocation +url: /blog/not-a-jvm-simd-stack-allocation/ +date: '2026-06-24' +author: Shai Almog +description: Java hides the machine on purpose, so you get no aligned memory, no stack-allocated arrays, and until recently no SIMD. Because Codename One compiles your bytecode to C instead of running on a JVM, we handed all three back to ourselves, and the benchmarks showed exactly where hand-written SIMD wins and where the C compiler already won. +syndicate_force: ["dzone", "foojay"] +feed_html: 'We are not a JVM, and that is how we got SIMD and stack allocation into Java Java hides the machine on purpose. Because Codename One compiles to C instead of running on a JVM, we gave Java aligned memory, stack allocation, and portable SIMD, and measured exactly where hand-written SIMD wins and where the compiler already won.' +--- + +![We're not a JVM, and that's how we got SIMD and stack allocation into Java](/blog/not-a-jvm-simd-stack-allocation.jpg) + +Can you allocate a Java array on the stack? In a normal JVM the answer is no, and no flag will change it. We do it anyway, in production, on iOS. While we were down there we also gave Java 16-byte-aligned memory and hand-written SIMD, and then got a sharp reminder of how good an optimizing C compiler already is when you measure your handcrafted code against it instead of against nothing. Three surprises, one explanation: Codename One is not a JVM. + +Java goes to real trouble to hide the machine from you. You cannot put an array on the stack, you cannot demand aligned memory, and until recently you could not write a SIMD instruction at all. Most of the time that is exactly right, and it is what keeps the garbage collector safe and your code portable. But Codename One does not run on a JVM. It compiles your bytecode to C, and then to a native binary, and that one difference let us hand all three back to ourselves, without waiting for Java to ship them. + +## Why Java doesn't give you this + +The JVM abstracts memory layout on purpose. The collector moves objects, so you get no alignment guarantee. Arrays are heap objects, so there is no stack allocation. The bytecode has no vector ops. Java's two long-running answers are Project Panama, whose Vector API is still incubating, and Project Valhalla, whose value types and flattening are arriving in pieces. Both are the platform reaching back down to the metal it spent two decades hiding. We needed that metal now, in image blends and codec loops, the hot paths where a phone actually spends its battery. + +## Dropping below Java is just emitting different C + +Because the output is C, "go to the metal" is not a language fight. It is a code-generation detail. The portable surface is one class, `com.codename1.util.Simd`, with a pure-Java fallback so the same code runs anywhere, and native implementations wired in per platform through our `@Concrete` annotation, which selects `IOSSimd`, `WindowsSimd`, or `LinuxSimd` at build time. + +{{< mermaid >}} +flowchart TB + J["Java / Kotlin"] --> BC["bytecode"] + BC --> CC["ParparVM
(translate to C)"] + CC --> NB["native binary"] + NB --> A["aligned arrays
(allocByte)"] + NB --> S["stack allocation
(allocaByte)"] + NB --> V["SIMD intrinsics
(per platform)"] +{{< /mermaid >}} + +Two of the three pieces are about *layout*, which is the Valhalla-shaped half of the story: + +- **Aligned allocation.** `allocByte`, `allocInt`, and `allocFloat` return blocks the native layer can load and store aligned. A plain `new byte[]` cannot promise alignment, so it cannot be a SIMD target. +- **Stack allocation.** `allocaByte` lowers, on ParparVM, to a stack-backed array, with an automatic heap fallback when it is too large to sit safely on the per-thread stack. It is a poor man's value-on-the-stack, and it is deprecated by design: method-local only, contents undefined until written, footguns in every direction. We ship it because for short-lived scratch buffers it is free, and "free" shows up in a paint loop. + +```java +Simd s = Simd.get(); +byte[] pixels = s.allocByte(width * height * 4); // aligned, not new byte[] +// a fused alpha blend then runs over the whole array in one native pass +``` + +## But doesn't escape analysis already do this? + +It is the first thing a server-side Java developer asks about the stack-allocation claim, and the answer is the interesting part. HotSpot's escape analysis can remove some allocations through scalar replacement: when the JIT proves an object never escapes its method, it keeps the fields in registers instead of allocating on the heap, and it will even do this for small fixed-size arrays (up to `EliminateAllocationArraySizeLimit`, 64 elements by default). That is real, and on hot server code it is excellent. + +Two things make it the wrong tool here. First, scalar replacement is not a buffer. It shatters an allocation into individual values; it does not hand you a contiguous, aligned block to pass to a SIMD kernel, which is exactly what we need. Second, and the bigger one for us, it depends on a JIT that has warmed up, and client code is cold. A mobile screen runs a method a handful of times, not the thousands of iterations the JIT wants before it compiles and analyzes anything, so the optimization that quietly saves you on a server never fires. On iOS there is no JIT to wait for at all, because we compile ahead of time to C. + +This is the part of client-side performance that server intuition gets backwards. On the server your code goes hot and the JIT eventually does remarkable things, escape analysis and autovectorization included. On the client most code stays cold for its whole life: you get the interpreter, or on iOS the ahead-of-time baseline, and none of the profile-guided work. If you want aligned buffers, stack scratch space, and SIMD on cold code, you have to ask for them outright. That is what these APIs are. + +## The interesting part is where we did less + +The easy version of this post is "we hand-wrote SIMD, it is faster, the end." That version is wrong. Hand-written SIMD is not a universal win, so we gate it per kernel and per platform, and the most useful result was learning where to stand down. + +{{< mermaid >}} +flowchart TD + K{"which kernel?"} -- "fused whole-array" --> F{"isSupported()?"} + F -- "yes" --> FW["native SIMD
(x86-64 and NEON)"] + K -- "byte-shuffle codec" --> B{"byte-shuffle
accelerated?"} + B -- "NEON (iOS, Win-on-Arm)" --> BW["native SIMD
(big win)"] + B -- "x86-64" --> BS["stay scalar
(compiler vectorizes it)"] +{{< /mermaid >}} + +The **fused whole-array kernels** win everywhere a native SIMD unit exists. A single pass over the buffer, no per-element call overhead. These are gated on `isSupported()`. Timing the native kernel against the equivalent Java scalar loop, 64K elements per pass, 300 passes: + +| Kernel | Windows x86-64 (SSE2) | Mac arm64 (NEON) | iOS arm64 (NEON) | +| --- | --- | --- | --- | +| int add | 12.6x (76ms to 6ms) | 7.1x (86ms to 12ms) | 22.5x (135ms to 6ms) | +| float multiply | 17.7x (71ms to 4ms) | 24.5x (49ms to 2ms) | 46.0x (138ms to 3ms) | + +The **chained byte-shuffle codec**, our Base64 path with interleaved pack and unpack, byte shifts, and table lookups, is a different story. On NEON it is dramatically faster. On x86-64 it is not, so we leave it scalar on purpose. That is what `isByteShuffleAccelerated()` reports, kept separate from `isSupported()`: + +| Base64, 8KB payload, 6000 iterations | Encode | Decode | +| --- | --- | --- | +| iOS arm64 (NEON), explicit SIMD | 86.6% faster | 57.4% faster | +| Mac arm64 (NEON), explicit SIMD | 81.3% faster | 74.9% faster | +| x86-64 | explicit SIMD gated off | explicit SIMD gated off | + +On x86-64 the compiler's `/O2` autovectorizer already matches the scalar loop, and SSE2 has no 3-way interleave to exploit, so shipping the intrinsics would add maintenance for nothing. The right move was to delete them and trust the compiler. + +The image kernels (alpha and mask blends, 100 iterations) mostly win, and one does not, which is the kind of thing you only learn by measuring: + +| Image op (SIMD off to on) | Windows x86-64 | Mac arm64 | iOS arm64 | +| --- | --- | --- | --- | +| createMask | 65.7% faster | 91.7% faster | 96.9% faster | +| modifyAlpha | 56.4% faster | 19.0% faster | 31.8% faster | +| applyMask | 47.3% faster | 23.3% faster | 7.2% **slower** | + +On iOS, `applyMask` is slightly slower with the native kernel on, so it stays off there. We do not get to assume; each kernel earns its place on each architecture. + +## The real lesson: measure against the optimizing compiler + +Here is the part worth your time, because it is the real lesson of the whole exercise. For a while our iOS and Mac test builds compiled the benchmark in Debug, which on Xcode means `-O0`: the scalar baseline was never optimized at all. So our hand-written SIMD was racing unoptimized code, winning by a wide margin, and we believed that margin. Windows was the reality check. It had been building the benchmark in Release the whole time, `/O2`, with the scalar loop fully autovectorized by the compiler, and against that baseline the margins were far smaller. For the Base64 byte-shuffle codec on x86-64 they nearly closed: the compiler was already doing what our intrinsics did, so the hand-written path was not worth keeping, and we gate it to scalar there. + +That is the real reason the Base64 byte codec ships scalar on x86-64. It is gated off not because SIMD is slow, but because the autovectorizer already matches it and SSE2 has no 3-way interleave left for us to add on top. The fused arithmetic and image kernels are a different shape, with an edge the compiler does not find on its own, so they still beat `/O2` and stay on. The durable takeaway: measure your handcrafted code against an optimizing compiler, not against naive scalar, before you trust it. + +So we fixed the measurement. The commit is titled, plainly, "optimize the translated C at -O2" ([#5209](https://github.com/codenameone/CodenameOne/pull/5209)), and it makes all three ports compile the scalar baseline the way the shipping app does. Every number above is from those builds on current `master`: Windows [#27900572303](https://github.com/codenameone/CodenameOne/actions/runs/27900572303), Mac [#27904116497](https://github.com/codenameone/CodenameOne/actions/runs/27904116497), iOS [#27904116502](https://github.com/codenameone/CodenameOne/actions/runs/27904116502). We do not capture the same stats on Linux yet, so it is absent from the tables rather than guessed. And we now benchmark the build we ship, not the build that is convenient. + +## The point + +The JVM hides the machine, and most days you want it to. But "Java" and "a JVM" are not the same thing. Because we compile to C, we got to decide, per platform and per loop, when to drop below Java and when to let the C compiler do the job it does better than we do. That is not a workaround for not being Java. It is the part of not being a JVM that we would keep. diff --git a/docs/website/layouts/shortcodes/mermaid.html b/docs/website/layouts/shortcodes/mermaid.html index bf5a23a297..092e00b566 100644 --- a/docs/website/layouts/shortcodes/mermaid.html +++ b/docs/website/layouts/shortcodes/mermaid.html @@ -28,11 +28,17 @@ 'var prefersDark = document.body.classList.contains("dark")' + ' || window.matchMedia("(prefers-color-scheme: dark)").matches;' + 'mermaid.initialize({' + - ' startOnLoad: true,' + + ' startOnLoad: false,' + ' theme: prefersDark ? "dark" : "default",' + ' securityLevel: "loose",' + ' fontFamily: "Poppins, system-ui, sans-serif"' + - '});'; + '});' + + // This loader is a dynamically-injected ES module, so it runs AFTER the + // document has parsed and DOMContentLoaded has already fired -- which means + // mermaid's own startOnLoad listener would never trigger. Render explicitly + // instead. The module's deferred execution guarantees every .mermaid div + // (across all shortcodes on the page) is in the DOM by the time run() fires. + 'mermaid.run();'; document.head.appendChild(s); })(); diff --git a/docs/website/static/blog/not-a-jvm-simd-stack-allocation.jpg b/docs/website/static/blog/not-a-jvm-simd-stack-allocation.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a502b99d399efc9e47cdd1b27ba71424eb2da842 GIT binary patch literal 109714 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%0As8vojAJ;ff(SWhK?Rq<1xwISav8oaLJ&c6AWfZ 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 Ylrj7JxXM41{G-4>3jBW*P~8>&2XEcsg8%>k literal 0 HcmV?d00001 diff --git a/scripts/website/languagetool-accept-blog.txt b/scripts/website/languagetool-accept-blog.txt index 799ed8927e..01333d8362 100644 --- a/scripts/website/languagetool-accept-blog.txt +++ b/scripts/website/languagetool-accept-blog.txt @@ -81,3 +81,8 @@ dSYM # Deobfuscation of Android stack traces via the mapping file. [Dd]eobfuscat(e|es|ed|ing|ion) + +# SIMD / compiler vocabulary from the low-level performance deep dives. +[Aa]utovectoriz(e|es|ed|ing|er|ation) +speedups? +footguns? diff --git a/scripts/website/queue_browser_syndication.py b/scripts/website/queue_browser_syndication.py index 3319d5b66e..0fb6256942 100644 --- a/scripts/website/queue_browser_syndication.py +++ b/scripts/website/queue_browser_syndication.py @@ -34,6 +34,7 @@ import argparse import datetime as dt import json +import re import sys from pathlib import Path @@ -59,24 +60,42 @@ WEEKLY_FRIDAY_PLATFORMS = {"dzone"} +def _forced_platforms(post: Post) -> set[str]: + """Platforms a post opts into regardless of the weekly-Friday gate, via + ``syndicate_force: [dzone, foojay]`` in its front matter. Lets the + occasional experimental deep dive join the rotation on a non-Friday.""" + raw = post.front_matter.get("syndicate_force") or [] + if isinstance(raw, str): + # The blog's lightweight front-matter parser is scalar-only, so it + # hands list syntax back as a raw string (e.g. '["dzone", "foojay"]'). + # Pull the bare platform tokens out so either form works. + raw = re.findall(r"[A-Za-z0-9_-]+", raw) + return {str(p).strip().lower() for p in raw} + + def _platform_accepts(platform: str, post: Post) -> bool: """Whether ``platform`` wants ``post`` at all. Friday-only platforms take - just the weekly digest post; everyone else takes every eligible post.""" + just the weekly digest post (plus any post that force-opts in); everyone + else takes every eligible post.""" if platform in WEEKLY_FRIDAY_PLATFORMS: - return post.date.weekday() == 4 + return post.date.weekday() == 4 or platform in _forced_platforms(post) return True -def _task_is_allowed(task: dict, dates_by_slug: dict[str, dt.date]) -> bool: +def _task_is_allowed(task: dict, dates_by_slug: dict[str, dt.date], + forced_by_slug: dict[str, set[str]]) -> bool: """Whether an existing queue task is still permitted under the per-platform rules. Used to prune tasks that were queued before the Friday-only filter existed (or added by hand): the drain tool submits whatever is in the queue, so a disallowed task left here would still reach moderation. A task whose post date is unknown is kept — we never silently drop something we - cannot evaluate.""" + cannot evaluate. A post that force-opts in via ``syndicate_force`` is kept + regardless of weekday.""" platform = task.get("site") if platform not in WEEKLY_FRIDAY_PLATFORMS: return True + if platform in forced_by_slug.get(task.get("slug"), set()): + return True post_date = dates_by_slug.get(task.get("slug")) if post_date is None: return True @@ -136,9 +155,12 @@ def main(argv: list[str]) -> int: state = State.load(Path(args.state_file)) blog_dir = Path(args.blog_dir) posts = _eligible_posts(today, floor, args.min_age_days, blog_dir) - # Slug -> publish date for *every* post, so existing queue tasks can be - # re-checked against the per-platform rules regardless of eligibility. - dates_by_slug = {p.slug: p.date for p in discover_posts(blog_dir)} + # Slug -> publish date (and forced-platform set) for *every* post, so + # existing queue tasks can be re-checked against the per-platform rules + # regardless of eligibility. + all_posts = discover_posts(blog_dir) + dates_by_slug = {p.slug: p.date for p in all_posts} + forced_by_slug = {p.slug: _forced_platforms(p) for p in all_posts} queue_path = Path(args.queue_file) if queue_path.exists(): @@ -152,7 +174,7 @@ def main(argv: list[str]) -> int: # sits in the queue, so this prune is what actually stops a stray task # from reaching moderation. original_tasks = queue.get("tasks", []) - kept_tasks = [t for t in original_tasks if _task_is_allowed(t, dates_by_slug)] + kept_tasks = [t for t in original_tasks if _task_is_allowed(t, dates_by_slug, forced_by_slug)] pruned = [t for t in original_tasks if t not in kept_tasks] if pruned: print(f"Pruning {len(pruned)} disallowed task(s) from the queue:") diff --git a/scripts/website/syndicate_browser_posts.py b/scripts/website/syndicate_browser_posts.py index 10343ab208..bdb745849f 100755 --- a/scripts/website/syndicate_browser_posts.py +++ b/scripts/website/syndicate_browser_posts.py @@ -295,7 +295,18 @@ def is_configured() -> bool: @staticmethod def accepts(post: Post) -> bool: # foojay only receives the weekly Friday digest post; the deep-dive - # posts published on other weekdays are not syndicated there. + # posts published on other weekdays are not syndicated there -- unless + # the post opts in explicitly with `syndicate_force: [foojay]` in its + # front matter, used to push the occasional experimental deep dive into + # the rotation off-Friday. + forced = post.front_matter.get("syndicate_force") or [] + if isinstance(forced, str): + # The blog's lightweight front-matter parser is scalar-only and + # hands list syntax back as a raw string (e.g. '["dzone", + # "foojay"]'); pull the bare platform tokens out. + forced = re.findall(r"[A-Za-z0-9_-]+", forced) + if "foojay" in {str(p).strip().lower() for p in forced}: + return True return post.date.weekday() == 4 def login(self, page) -> None: