2 Commits
Author SHA1 Message Date
Jean Boussier f60a60427f [ruby/json] Centralize requires in the test suite
https://github.com/ruby/json/commit/73edd53644
2026-09-08 08:23:12 +00:00
Jean Boussier 61e2d8e36f [ruby/json] Replace Ryu with a C99 port of fast_float
Contrary to Ryu, it remains correct up to 18 mantissa digits,
meaning we don't have to fallback as much to Ruby's much slower
`rb_cstr_to_dbl`.

On `canada.json`, the most number heavy benchmark, `ffp_s2d` is less
than 5% of total runtime. Most of the time is actually sent parsing,
not decoding.

There is a more complete C99 port of `fast_float` at
https://github.com/kolemannix/ffc.h which also does parsing and
could be worth considering, however it might make it much harder
to detect when we're outside the safe range and to fallback,
so unclear if it would be a win.

Credit to Tilo Sloboda for the C99 port (sligthly reworked).

```
== Parsing citm_catalog.json (500124 bytes)
ruby 4.0.5 (2026-05-20 revision https://github.com/ruby/json/commit/64336ffd0e) +YJIT +PRISM [arm64-darwin25]
Warming up --------------------------------------
               after    73.000 i/100ms
Calculating -------------------------------------
               after    733.301 (± 1.0%) i/s    (1.36 ms/i) -      3.723k in   5.077044s

Comparison:
before:      716.8 i/s
 after:      733.3 i/s - 1.02x  faster

== Parsing float parsing (2090303 bytes)
ruby 4.0.5 (2026-05-20 revision https://github.com/ruby/json/commit/64336ffd0e) +YJIT +PRISM [arm64-darwin25]
Warming up --------------------------------------
               after    35.000 i/100ms
Calculating -------------------------------------
               after    353.130 (± 0.3%) i/s    (2.83 ms/i) -      1.785k in   5.054791s

Comparison:
before:      323.1 i/s
 after:      353.1 i/s - 1.09x  faster
```

https://github.com/ruby/json/commit/4185ef1a7b
2026-06-16 07:42:35 +00:00