Skip to content

Performance

go-ruby-strscan/strscan is the pure-Go library that rbgo binds for Ruby's strscan. This page records a comparative benchmark of that module against the reference Ruby runtimes, part of the ecosystem-wide per-module parity suite.

What is measured

The same Ruby script — tokenize a string with a StringScanner loop (scan per token until eos?) — is run under every runtime. rbgo's number reflects this pure-Go library doing the work; every other column is that interpreter's own strscan stdlib. So the comparison is the Ruby-visible operation, apples-to-apples across interpreters. The script prints a deterministic checksum and its output is checked byte-identical to MRI before timing.

  • Host: Apple M4 Max, macOS (darwin/arm64). Method: best-of-5 wall time (best, not mean, to suppress scheduler noise); single-shot processes, no warm-up beyond the script's own loop.
  • Runtimes: ruby 4.0.5 +PRISM (MRI, the oracle) and ruby --yjit; jruby 10.1.0.0 (OpenJDK 25); truffleruby 34.0.1 (GraalVM CE Native).
  • The benchmark script and harness live in rbgo's repo under bench/modules/ (strscan.rb + run.sh). Reproduce: RBGO=./rbgo TRUFFLE=truffleruby bash bench/modules/run.sh 5.

Result (best of 5, ms)

Runtime time vs MRI
rbgo (go-ruby-strscan) 10720 71.5×
MRI (ruby 4.0.5) 150 1.00×
MRI + YJIT 140 0.93×
JRuby 10.1.0.0 1420 9.47×
TruffleRuby 34.0.1 200 1.33×

Honest gap: rbgo is ~71x slower than MRI on this StringScanner loop. The workload drives a very high rate of per-scan interpreter dispatch plus regexp setup, and the binding currently re-does work each scan. This is the top per-module optimization target for go-ruby-strscan — output is byte-identical to MRI, only throughput lags.

Honest framing

JRuby and TruffleRuby are timed cold, single-shot, so they carry JVM / Graal startup on every run — read them as one-shot ruby file.rb costs, the same way rbgo and MRI are measured, not as steady-state JIT numbers. Rows that complete in well under ~200 ms carry the most relative noise; treat their ratios as order-of-magnitude. These are real measured numbers from the 2026-06-29 run — nothing is cherry-picked.