Age | Commit message (Collapse) | Author |
|
https://github.com/ruby/json/commit/bea96e0a69
|
|
https://github.com/ruby/json/commit/aa5b7d6acb
|
|
Fix: https://github.com/ruby/json/issues/748
`MultiJson` pass `State#to_h` as options, and the `as_json`
property defaults to `false` but `false` wasn't accepted by
the constructor.
|
|
https://github.com/ruby/json/commit/8b56d47254
|
|
Co-authored-by: Jean Boussier <[email protected]>
|
|
Co-authored-by: Jean Boussier <[email protected]>
|
|
https://github.com/ruby/json/commit/e03515ac8b
|
|
The goal is to be able to dispatch to more optimized search implementations
without having to duplicate the escaping code.
Somehow, this is a few % faster already:
```
== Encoding activitypub.json (52595 bytes)
ruby 3.4.1 (2024-12-25 revision https://github.com/ruby/json/commit/48d4efcb85) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
after 2.257k i/100ms
Calculating -------------------------------------
after 22.930k (± 1.3%) i/s (43.61 μs/i) - 115.107k in 5.020814s
Comparison:
before: 21604.0 i/s
after: 22930.1 i/s - 1.06x faster
== Encoding citm_catalog.json (500298 bytes)
ruby 3.4.1 (2024-12-25 revision https://github.com/ruby/json/commit/48d4efcb85) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
after 137.000 i/100ms
Calculating -------------------------------------
after 1.397k (± 1.1%) i/s (715.57 μs/i) - 6.987k in 5.000408s
Comparison:
before: 1344.4 i/s
after: 1397.5 i/s - 1.04x faster
== Encoding twitter.json (466906 bytes)
ruby 3.4.1 (2024-12-25 revision https://github.com/ruby/json/commit/48d4efcb85) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
after 249.000 i/100ms
Calculating -------------------------------------
after 2.464k (± 1.8%) i/s (405.81 μs/i) - 12.450k in 5.054131s
Comparison:
before: 2326.5 i/s
after: 2464.2 i/s - 1.06x faster
```
https://github.com/ruby/json/commit/8fb5ae807f
|
|
On some platforms ctype functions are defined as macros accesing tables.
A plain char may be `signed` or `unsigned` per implementations and the
extension result implementation dependent.
gcc warns such case:
```
parser.c: In function 'rstring_cache_fetch':
parser.c:138:33: warning: array subscript has type 'char' [-Wchar-subscripts]
138 | if (RB_UNLIKELY(!isalpha(str[0]))) {
| ~~~^~~
parser.c: In function 'rsymbol_cache_fetch':
parser.c:190:33: warning: array subscript has type 'char' [-Wchar-subscripts]
190 | if (RB_UNLIKELY(!isalpha(str[0]))) {
| ~~~^~~
```
https://github.com/ruby/json/commit/4431b362f6
|
|
- Also modified the gemspec files' blob as the ragel's `parser.rl`
file was removed in https://github.com/ruby/json/commit/c8d5236a921e
https://github.com/ruby/json/commit/b2b106e314
|
|
Co-authored-by: Jean Boussier <[email protected]>
|
|
https://github.com/ruby/json/commit/edd61b4a8b
|
|
https://github.com/ruby/json/commit/dbcf614e50
|
|
https://github.com/ruby/json/commit/b9bfeecfa9
Notes:
Merged: https://github.com/ruby/ruby/pull/12602
|
|
https://github.com/ruby/json/commit/2f57f40467
Notes:
Merged: https://github.com/ruby/ruby/pull/12602
|
|
https://github.com/ruby/json/commit/86c0d4eb7e
Notes:
Merged: https://github.com/ruby/ruby/pull/12602
|
|
https://github.com/ruby/json/commit/f8817fe56c
Notes:
Merged: https://github.com/ruby/ruby/pull/12602
|
|
https://github.com/ruby/json/commit/9e3500f345
Co-authored-by: Jean Boussier <[email protected]>
Notes:
Merged: https://github.com/ruby/ruby/pull/12602
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/12599
|
|
Ref: https://github.com/ruby/ruby/pull/12598
This could lead to an infinite loop.
https://github.com/ruby/json/commit/f8cfa2696a
Notes:
Merged: https://github.com/ruby/ruby/pull/12600
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/12598
|
|
https://github.com/ruby/json/commit/5e6cfcf724
Notes:
Merged: https://github.com/ruby/ruby/pull/12598
|
|
Move all the decimal_class option parsing in the constructor.
https://github.com/ruby/json/commit/e9adefdc38
Notes:
Merged: https://github.com/ruby/ruby/pull/12598
|
|
Doesn't make a measurable performance difference but is a
bit clearer.
https://github.com/ruby/json/commit/314d117c61
Notes:
Merged: https://github.com/ruby/ruby/pull/12598
|
|
https://github.com/ruby/json/commit/dd9c46c805
Notes:
Merged: https://github.com/ruby/ruby/pull/12598
|
|
We only use that buffer for parsing integer and floats, these
are unlikely to be very big, and if so we can just use RB_ALLOCV as it will
almost always end in a small `alloca`.
This allow to no longer need `rb_protect` around the parser.
https://github.com/ruby/json/commit/994859916a
Notes:
Merged: https://github.com/ruby/ruby/pull/12598
|
|
https://github.com/ruby/json/commit/591056a526
Notes:
Merged: https://github.com/ruby/ruby/pull/12598
|
|
And get rid of the Ragel parser.
This is 7% faster on activitypub, 15% after on twitter and 11% faster
on citm_catalog.
There might be some more optimization opportunities, I did a quick
optimization pass to fix a regression in string parsing, but other
than that I haven't dug much in performance.
Notes:
Merged: https://github.com/ruby/ruby/pull/12598
|
|
Ref: https://github.com/ruby/json/pull/728
Ref: https://github.com/ruby/ruby/pull/12569
https://github.com/ruby/json/commit/30a4a86954
|
|
Ref: https://github.com/ruby/json/pull/718
The existing `Parser` interface is pretty bad, as it forces to
instantiate a new instance for each document.
Instead it's preferable to only take the config and do all the
initialization needed, and then keep the parsing state on the
stack on in ephemeral memory.
This refactor makes the `JSON::Coder` pull request much easier to
implement in a performant way.
https://github.com/ruby/json/commit/c8d5236a92
Co-Authored-By: Étienne Barrié <[email protected]>
|
|
Co-authored-by: Jean Boussier <[email protected]>
Notes:
Merged: https://github.com/ruby/ruby/pull/12568
|
|
Introduce a simplified table for the most common case, which is
`script_safe: false, ascii_only: false`.
On the `script_safe` table, now only `0xE2` does a multi-byte check.
Merge back `convert_ASCII_to_JSON`, as it no longer help much with
the simplified escape table.
```
== Encoding mixed utf8 (5003001 bytes)
ruby 3.4.1 (2024-12-25 revision 48d4efcb85) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
after 38.000 i/100ms
Calculating -------------------------------------
after 398.220 (± 3.0%) i/s (2.51 ms/i) - 2.014k in 5.061659s
Comparison:
before: 381.8 i/s
after: 398.2 i/s - same-ish: difference falls within error
== Encoding mostly utf8 (5001001 bytes)
ruby 3.4.1 (2024-12-25 revision 48d4efcb85) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
after 39.000 i/100ms
Calculating -------------------------------------
after 393.337 (± 2.5%) i/s (2.54 ms/i) - 1.989k in 5.059397s
Comparison:
before: 304.3 i/s
after: 393.3 i/s - 1.29x faster
== Encoding twitter.json (466906 bytes)
ruby 3.4.1 (2024-12-25 revision 48d4efcb85) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
after 244.000 i/100ms
Calculating -------------------------------------
after 2.436k (± 0.9%) i/s (410.43 μs/i) - 12.200k in 5.007702s
Comparison:
before: 2125.9 i/s
after: 2436.5 i/s - 1.15x faster
```
|
|
https://github.com/ruby/json/commit/f745ec145e
Notes:
Merged: https://github.com/ruby/ruby/pull/12394
|
|
Check for existence of strnlen() and use alternative code if it is missing.
https://github.com/ruby/json/commit/48d4bbc3a0
Notes:
Merged: https://github.com/ruby/ruby/pull/12394
|
|
https://github.com/ruby/json/commit/e1f6456499
Notes:
Merged: https://github.com/ruby/ruby/pull/12267
|
|
Fix: https://github.com/ruby/json/issues/715
The first byte check was missing.
https://github.com/ruby/json/commit/93a7f8717d
Notes:
Merged: https://github.com/ruby/ruby/pull/12267
|
|
GCC 13 prints the following warning.
https://rubyci.s3.amazonaws.com/ubuntu/ruby-master/log/20241127T001003Z.log.html.gz
```
compiling generator.c
generator.c: In function ‘raise_generator_error’:
generator.c:91:5: warning: function ‘raise_generator_error’ might be a candidate for ‘gnu_printf’ format attribute [-Wsuggest-attribute=format]
91 | VALUE str = rb_vsprintf(fmt, args);
| ^~~~~
```
This change prevents the warning by specifying the format attribute.
https://github.com/ruby/json/commit/b8c1490846
|
|
Fix: https://github.com/ruby/json/issues/710
Makes it easier to debug why a given tree of objects can't
be dumped as JSON.
Co-Authored-By: Étienne Barrié <[email protected]>
|
|
It's using `rb_gc_mark_maybe` under the hood, which isn't what
we need.
https://github.com/ruby/json/commit/e10d0bffcd
|
|
Ref: https://github.com/ruby/json/issues/524
Rather than to buffer everything in memory.
Unfortunately Ruby doesn't provide an API to write into
and IO without first allocating a string, which is a bit
wasteful.
https://github.com/ruby/json/commit/f017af6c0a
|
|
https://github.com/ruby/json/commit/2d62ec449f
Notes:
Merged: https://github.com/ruby/ruby/pull/12103
|
|
https://github.com/ruby/json/commit/d5e4a6e3fd
Notes:
Merged: https://github.com/ruby/ruby/pull/12103
|
|
https://github.com/ruby/json/commit/61f022dfbd
Notes:
Merged: https://github.com/ruby/ruby/pull/12103
|
|
Otherwise the likeliness of seeing that key again is really low, and looking up
the cache is just a waste.
Before:
```
== Parsing small hash (65 bytes)
ruby 3.4.0dev (2024-11-13T12:32:57Z fstr-update-callba.. https://github.com/ruby/json/commit/9b44b455b3) +YJIT +PRISM [arm64-darwin24]
Warming up --------------------------------------
json 343.049k i/100ms
oj 213.943k i/100ms
Oj::Parser 31.583k i/100ms
rapidjson 303.433k i/100ms
Calculating -------------------------------------
json 3.704M (± 1.5%) i/s (270.01 ns/i) - 18.525M in 5.003078s
oj 2.200M (± 1.1%) i/s (454.46 ns/i) - 11.125M in 5.056526s
Oj::Parser 285.369k (± 4.8%) i/s (3.50 μs/i) - 1.453M in 5.103866s
rapidjson 3.216M (± 1.6%) i/s (310.95 ns/i) - 16.082M in 5.001973s
Comparison:
json: 3703517.4 i/s
rapidjson: 3215983.0 i/s - 1.15x slower
oj: 2200417.1 i/s - 1.68x slower
Oj::Parser: 285369.1 i/s - 12.98x slower
== Parsing test from oj (258 bytes)
ruby 3.4.0dev (2024-11-13T12:32:57Z fstr-update-callba.. https://github.com/ruby/json/commit/9b44b455b3) +YJIT +PRISM [arm64-darwin24]
Warming up --------------------------------------
json 54.539k i/100ms
oj 41.473k i/100ms
Oj::Parser 24.064k i/100ms
rapidjson 51.466k i/100ms
Calculating -------------------------------------
json 549.386k (± 1.6%) i/s (1.82 μs/i) - 2.781M in 5.064316s
oj 417.003k (± 1.3%) i/s (2.40 μs/i) - 2.115M in 5.073047s
Oj::Parser 226.500k (± 4.7%) i/s (4.42 μs/i) - 1.131M in 5.005466s
rapidjson 526.124k (± 1.0%) i/s (1.90 μs/i) - 2.676M in 5.087176s
Comparison:
json: 549385.6 i/s
rapidjson: 526124.3 i/s - 1.04x slower
oj: 417003.4 i/s - 1.32x slower
Oj::Parser: 226500.4 i/s - 2.43x slower
```
After:
```
== Parsing small hash (65 bytes)
ruby 3.4.0dev (2024-11-13T12:32:57Z fstr-update-callba.. https://github.com/ruby/json/commit/9b44b455b3) +YJIT +PRISM [arm64-darwin24]
Warming up --------------------------------------
json 361.394k i/100ms
oj 217.203k i/100ms
Oj::Parser 28.855k i/100ms
rapidjson 303.404k i/100ms
Calculating -------------------------------------
json 3.859M (± 2.9%) i/s (259.13 ns/i) - 19.515M in 5.061302s
oj 2.191M (± 1.6%) i/s (456.49 ns/i) - 11.077M in 5.058043s
Oj::Parser 315.132k (± 7.1%) i/s (3.17 μs/i) - 1.587M in 5.065707s
rapidjson 3.156M (± 4.0%) i/s (316.88 ns/i) - 15.777M in 5.008949s
Comparison:
json: 3859046.5 i/s
rapidjson: 3155778.5 i/s - 1.22x slower
oj: 2190616.0 i/s - 1.76x slower
Oj::Parser: 315132.4 i/s - 12.25x slower
== Parsing test from oj (258 bytes)
ruby 3.4.0dev (2024-11-13T12:32:57Z fstr-update-callba.. https://github.com/ruby/json/commit/9b44b455b3) +YJIT +PRISM [arm64-darwin24]
Warming up --------------------------------------
json 55.682k i/100ms
oj 40.343k i/100ms
Oj::Parser 25.119k i/100ms
rapidjson 51.500k i/100ms
Calculating -------------------------------------
json 555.808k (± 1.4%) i/s (1.80 μs/i) - 2.784M in 5.010092s
oj 412.283k (± 1.7%) i/s (2.43 μs/i) - 2.098M in 5.089900s
Oj::Parser 279.306k (±13.3%) i/s (3.58 μs/i) - 1.356M in 5.022079s
rapidjson 517.177k (± 2.7%) i/s (1.93 μs/i) - 2.626M in 5.082352s
Comparison:
json: 555808.3 i/s
rapidjson: 517177.1 i/s - 1.07x slower
oj: 412283.2 i/s - 1.35x slower
Oj::Parser: 279306.5 i/s - 1.99x slower
```
https://github.com/ruby/json/commit/00c45ddc9f
|
|
Fix: https://github.com/ruby/json/issues/697
This way even if `Encoding.default_external` is set to a weird value
the document will be parsed just fine.
https://github.com/ruby/json/commit/3a8505a8fa
|
|
https://github.com/ruby/json/commit/e51e796697
|
|
Before this commit, we would try to scan for a float, then if that
failed, scan for an integer. But floats and integers have many bytes in
common, so we would end up scanning the same bytes multiple times.
This patch combines integer and float scanning machines so that we only
have to scan bytes once. If the machine finds "float parts", then it
executes the "isFloat" transition in the machine, which sets a boolean
letting us know that the parser found a float.
If we didn't find a float, but we did match, then we know it's an int.
https://github.com/ruby/json/commit/0c0e0930cd
|
|
https://github.com/ruby/json/commit/49650f7312
|
|
Fix: https://github.com/ruby/json/issues/694
This was lost during the .gemspec merge and not noticed
because it was falling back to loading the jars from the
stdlib.
https://github.com/ruby/json/commit/07cf261251
|
|
https://github.com/ruby/json/commit/8071cc6f09
|