Measured 2026-09-29.
TinyGo's frames are 13–18% faster at the median, but its page leaks about one RGBA frame of memory per frame, which makes it unfit for a page left open.
The shaders demo lives in ~/projects/ntcharts/examples/shaders, not in
ntcharts3d. The work is uncommitted on a new branch shaders-stage-timings
in ~/projects/ntcharts. All tests pass, including the real-GPU test.
| <!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>AGENTS.md paired comparison</title><style> | |
| :root{--ink:#192b3b;--muted:#5b6c7a;--border:#dce4e9;--left:#fff0d8;--right:#e1efff}*{box-sizing:border-box}body{margin:0;background:#f4f7fa;color:var(--ink);font:15px/1.5 system-ui,-apple-system,sans-serif}main{max-width:1680px;margin:auto;padding:32px}header{max-width:1100px;margin-bottom:24px}.title{font-size:32px;font-weight:750;letter-spacing:-.6px;margin:0 0 12px}.subtitle{font-size:17px;color:var(--muted)}a{color:#185f99}nav{display:flex;gap:8px;flex-wrap:wrap;margin:18px 0}nav a{background:white;border:1px solid var(--border);border-radius:6px;padding:7px 12px;text-decoration:none}.toolbar{display:flex;gap:18px;align-items:center;flex-wrap:wrap;background:white;border:1px solid var(--border);border-radius:8px;padding:12px 16px;margin-bottom:22px}select,button{font:inherit;padding:6px 10px;border:1px solid #b5c5d1;border-radius:5 |
The fix lives on a branch of my openresty/luajit2 fork:
- branch: https://github.com/neomantra/openresty-luajit2/tree/ppc64le-num2int-fix
- the single commit: https://github.com/neomantra/openresty-luajit2/commit/d18fd8f681f644f83eee28bf63b1cf4b1be44cda
It is one commit on top of openresty/luajit2 master (v2.1-20260914). It adds 64-bit versions of the four number-conversion helpers in src/vm_ppc.dasc and reverts the lj_tab.c workaround from luajit2 PR #274, which was papering over the same bug. Nothing outside PPC64 changes.
Everything I have run so far was under QEMU user emulation, so a run on real POWER hardware is the confirmation this needs. Pick whichever of the following fits your setup.
| package main | |
| import ( | |
| "fmt" | |
| "math/rand" | |
| "os" | |
| "strings" | |
| "time" | |
| tea "charm.land/bubbletea/v2" |
| #!/bin/bash | |
| # | |
| # This script is used to generate a version string for the go.mod replace directive. | |
| # This is of the format version-timestamp-hash, where version is the current version of the module, | |
| # timestamp is the current time in UTC, and hash is the short git hash of the current commit. | |
| # | |
| # This script emits the "version-timestamp-hash" based on the current git HEAD. | |
| # | |
| # If passed with an argument, that string is used as the version, | |
| # otherwise "v0.0.0" is used as the default version. |
Last night we was my first time doing LLM-based performance engineering, and wow what fun! I token-maxxed $20 of Codex 5.5, then wrapped up with Opus 4.7, along with Gemini for some code reivew.
After six hours, I and a 165x improvement of PIXterm! What follows is the performance log we kept.
| package curl | |
| import ( | |
| "bytes" | |
| "fmt" | |
| "io" | |
| "net/http" | |
| "strconv" | |
| "strings" | |
| "unicode/utf8" |



