> blog // measurement

Neper vs Dart: what it costs an LLM to write each one

September 27, 2026 · measured with scripts/lang-stats.py

Neper claims to be optimized for LLM-generated software, so we measure it the way we would measure a compiler: on real work. For the last seven days Claude wrote 12.7 MB of Neper and 9.3 MB of Dart in our repositories. Neper came out first on our scorecard, 62 to 59, at the same cost per kilobyte. It was not a clean sweep, and the losses are more useful than the win.

How we measure

scripts/lang-stats.py reads every Claude Code transcript on the machine and follows each byte of source to the file it landed in, whether it arrived through the Write and Edit tools, a shell heredoc, a patch.exe spec or a Python patch script. A KB is 1,000 bytes of landed source, never tokens. Every token is priced at the Opus list rate, so dollars compare effort, not bills.

The script judges 28 columns across cost, rework, correctness, time, context load and style, and ranks each language in each column. The scorecard is the mean of those ranks, from 0 (worst in every column) to 100 (best in every column).

Two caveats before any numbers:

Terminal output of lang-stats.py for September 20 to 27, Claude only: scorecard, cost, process, repair and delivery tables for Neper, Dart and Python.
python scripts/lang-stats.py -d 7 -a claude, September 20–27, 2026. Green marks the best value in a column, cyan the second best, red the worst.

Where Neper wins

ColumnNeperDart
$ per KB of code written directly0.1550.272
Output tokens per KB1.6K2.1K
Bytes read per byte written1.84.6
Edits that built on the first try95.1%92.8%
Model seconds per KB1822
Tool seconds per KB1316

When the model writes Neper directly it spends 43% less per kilobyte than it does on Dart, and emits a quarter fewer tokens for the same bytes. That is the small, single-meaning vocabulary doing its job: there is less to say and less to reconsider. The model also reads far less to write the same amount, and more of its edits build the first time.

Where Neper loses

ColumnNeperDart
Context at a turn that lands code422K tokens190K tokens
Share of code delivered by script22%6%
Turns from a compile failure to a passing build41
Failed build commands8.1%7.2%
Median build command2,174 ms891 ms

The trend is the good news

The same measurement over 30 days, Claude only:

Neper30 days7 days
$ per KB, all-in0.6910.407
Share of code delivered by script38%22%
$ per KB, written directly0.1980.155
Context at a turn that lands code513K422K
Thinking tokens per byte0.0690.061
Failed build commands4.9%8.1%
Turns to fix a compile failure24

Most of the cost drop has one cause. On September 26 a small Neper program, tools/patch, replaced the Python scripts sessions had been using to patch the compiler: those went from 254 and 326 a day to one. Over 30 days, with scripts carrying 38% of the code, Neper cost 35% more than Dart per KB. Over the last seven it costs the same.

Fixing our own ruler.

Measuring this found three bugs in the measurement. patch.exe edits were invisible, 326 KB of them. Any command that mentioned the repository's path counted as a build, which made 30–58% of the weekly “builds” a cd or a git log. And pooling agents compared Codex's Neper with Claude's Dart. All three are fixed. Three more distortions are queued: build failures after a patch script counted as failed edits, probe programs in scratch folders counted as landed code, and the Dart compile detector.

What we are doing about it

  1. Diagnostics that name their subject: the callee, the missing name, the two counts, the legal escapes. One fixture per recurring code, tracked by how often the next build repeats it.
  2. A machine-applicable rename. The most frequent compile error is a local that reuses a module-scope name. Neper forbids that shadowing on purpose, one meaning per name at every position, so the fix is a repair the tools apply without a model turn, not a looser rule.
  3. Route agents to the compiler's context instead of whole files, and to a “traps” section in the language card: reserved names, the no-shadowing rule, the escape set. The targets are context near 200K and a script share near Dart's.
  4. A warm rebuild that is actually warm. A repeated build of an unchanged program should take the incremental path we have measured at 80 ms for the compiler.

Every number above comes from one command, and the script is in the repository:

$ python scripts/lang-stats.py --harness claude -d 7

Run it on your own transcripts. If your numbers disagree with ours, we want to know.