Skip to content

Conversation

byroot
Copy link
Owner

@byroot byroot commented Dec 12, 2024

Ref: https://bugs.ruby-lang.org/issues/20878

It's definitely simpler and less code if using only high level
rb_str APIs. However the performance is really bad.

== Encoding small mixed (34 bytes)
ruby 3.4.0dev (2024-12-12T09:30:43Z master 197a3efc75) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
  json-2.9.0-rstring   270.614k i/100ms
Calculating -------------------------------------
  json-2.9.0-rstring      2.810M (± 0.7%) i/s  (355.92 ns/i) -     14.072M in   5.008785s

Comparison:
          json-2.9.0:  6841854.5 i/s
  json-2.9.0-rstring:  2809586.8 i/s - 2.44x  slower

== Encoding small nested array (121 bytes)
ruby 3.4.0dev (2024-12-12T09:30:43Z master 197a3efc75) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
  json-2.9.0-rstring   104.936k i/100ms
Calculating -------------------------------------
  json-2.9.0-rstring      1.066M (± 0.9%) i/s  (938.47 ns/i) -      5.352M in   5.022882s

Comparison:
          json-2.9.0:  2769443.8 i/s
  json-2.9.0-rstring:  1065559.4 i/s - 2.60x  slower

== Encoding small hash (65 bytes)
ruby 3.4.0dev (2024-12-12T09:30:43Z master 197a3efc75) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
  json-2.9.0-rstring   288.458k i/100ms
Calculating -------------------------------------
  json-2.9.0-rstring      2.965M (± 0.7%) i/s  (337.22 ns/i) -     15.000M in   5.058436s

Comparison:
          json-2.9.0:  7606155.3 i/s
  json-2.9.0-rstring:  2965448.7 i/s - 2.56x  slower

== Encoding mixed utf8 (5003001 bytes)
ruby 3.4.0dev (2024-12-12T09:30:43Z master 197a3efc75) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
  json-2.9.0-rstring    50.000 i/100ms
Calculating -------------------------------------
  json-2.9.0-rstring    504.537 (± 0.8%) i/s    (1.98 ms/i) -      2.550k in   5.054431s

Comparison:
          json-2.9.0:      378.8 i/s
  json-2.9.0-rstring:      504.5 i/s - 1.33x  faster

== Encoding mostly utf8 (5001001 bytes)
ruby 3.4.0dev (2024-12-12T09:30:43Z master 197a3efc75) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
  json-2.9.0-rstring    38.000 i/100ms
Calculating -------------------------------------
  json-2.9.0-rstring    378.373 (± 0.8%) i/s    (2.64 ms/i) -      1.900k in   5.021755s

Comparison:
          json-2.9.0:      303.5 i/s
  json-2.9.0-rstring:      378.4 i/s - 1.25x  faster

== Encoding integers (8009 bytes)
ruby 3.4.0dev (2024-12-12T09:30:43Z master 197a3efc75) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
  json-2.9.0-rstring     5.373k i/100ms
Calculating -------------------------------------
  json-2.9.0-rstring     53.530k (± 1.6%) i/s   (18.68 μs/i) -    268.650k in   5.020019s

Comparison:
          json-2.9.0:    96002.0 i/s
  json-2.9.0-rstring:    53530.1 i/s - 1.79x  slower

== Encoding activitypub.json (52595 bytes)
ruby 3.4.0dev (2024-12-12T09:30:43Z master 197a3efc75) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
  json-2.9.0-rstring     1.060k i/100ms
Calculating -------------------------------------
  json-2.9.0-rstring     10.621k (± 0.3%) i/s   (94.15 μs/i) -     54.060k in   5.089908s

Comparison:
          json-2.9.0:    22854.8 i/s
  json-2.9.0-rstring:    10621.1 i/s - 2.15x  slower

== Encoding citm_catalog.json (500298 bytes)
ruby 3.4.0dev (2024-12-12T09:30:43Z master 197a3efc75) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
  json-2.9.0-rstring    62.000 i/100ms
Calculating -------------------------------------
  json-2.9.0-rstring    621.649 (± 0.5%) i/s    (1.61 ms/i) -      3.162k in   5.086598s

Comparison:
          json-2.9.0:     1354.1 i/s
  json-2.9.0-rstring:      621.6 i/s - 2.18x  slower

== Encoding twitter.json (466906 bytes)
ruby 3.4.0dev (2024-12-12T09:30:43Z master 197a3efc75) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
  json-2.9.0-rstring    97.000 i/100ms
Calculating -------------------------------------
  json-2.9.0-rstring    983.052 (± 1.0%) i/s    (1.02 ms/i) -      4.947k in   5.032796s

Comparison:
          json-2.9.0:     2175.2 i/s
  json-2.9.0-rstring:      983.1 i/s - 2.21x  slower

== Encoding canada.json (2090234 bytes)
ruby 3.4.0dev (2024-12-12T09:30:43Z master 197a3efc75) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
  json-2.9.0-rstring     1.000 i/100ms
Calculating -------------------------------------
  json-2.9.0-rstring     19.360 (± 0.0%) i/s   (51.65 ms/i) -     97.000 in   5.010646s

Comparison:
          json-2.9.0:       20.3 i/s
  json-2.9.0-rstring:       19.4 i/s - 1.05x  slower

== Encoding many #to_json calls (2701 bytes)
ruby 3.4.0dev (2024-12-12T09:30:43Z master 197a3efc75) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
  json-2.9.0-rstring     2.108k i/100ms
Calculating -------------------------------------
  json-2.9.0-rstring     21.399k (± 1.0%) i/s   (46.73 μs/i) -    107.508k in   5.024491s

Comparison:
          json-2.9.0:    31034.7 i/s
  json-2.9.0-rstring:    21399.2 i/s - 1.45x  slower

Ref: https://bugs.ruby-lang.org/issues/20878

It's definitely simpler and less code if using only high level
`rb_str` APIs. However the performance is really bad.

```
== Encoding small mixed (34 bytes)
ruby 3.4.0dev (2024-12-12T09:30:43Z master 197a3efc75) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
  json-2.9.0-rstring   270.614k i/100ms
Calculating -------------------------------------
  json-2.9.0-rstring      2.810M (± 0.7%) i/s  (355.92 ns/i) -     14.072M in   5.008785s

Comparison:
          json-2.9.0:  6841854.5 i/s
  json-2.9.0-rstring:  2809586.8 i/s - 2.44x  slower

== Encoding small nested array (121 bytes)
ruby 3.4.0dev (2024-12-12T09:30:43Z master 197a3efc75) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
  json-2.9.0-rstring   104.936k i/100ms
Calculating -------------------------------------
  json-2.9.0-rstring      1.066M (± 0.9%) i/s  (938.47 ns/i) -      5.352M in   5.022882s

Comparison:
          json-2.9.0:  2769443.8 i/s
  json-2.9.0-rstring:  1065559.4 i/s - 2.60x  slower

== Encoding small hash (65 bytes)
ruby 3.4.0dev (2024-12-12T09:30:43Z master 197a3efc75) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
  json-2.9.0-rstring   288.458k i/100ms
Calculating -------------------------------------
  json-2.9.0-rstring      2.965M (± 0.7%) i/s  (337.22 ns/i) -     15.000M in   5.058436s

Comparison:
          json-2.9.0:  7606155.3 i/s
  json-2.9.0-rstring:  2965448.7 i/s - 2.56x  slower

== Encoding mixed utf8 (5003001 bytes)
ruby 3.4.0dev (2024-12-12T09:30:43Z master 197a3efc75) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
  json-2.9.0-rstring    50.000 i/100ms
Calculating -------------------------------------
  json-2.9.0-rstring    504.537 (± 0.8%) i/s    (1.98 ms/i) -      2.550k in   5.054431s

Comparison:
          json-2.9.0:      378.8 i/s
  json-2.9.0-rstring:      504.5 i/s - 1.33x  faster

== Encoding mostly utf8 (5001001 bytes)
ruby 3.4.0dev (2024-12-12T09:30:43Z master 197a3efc75) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
  json-2.9.0-rstring    38.000 i/100ms
Calculating -------------------------------------
  json-2.9.0-rstring    378.373 (± 0.8%) i/s    (2.64 ms/i) -      1.900k in   5.021755s

Comparison:
          json-2.9.0:      303.5 i/s
  json-2.9.0-rstring:      378.4 i/s - 1.25x  faster

== Encoding integers (8009 bytes)
ruby 3.4.0dev (2024-12-12T09:30:43Z master 197a3efc75) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
  json-2.9.0-rstring     5.373k i/100ms
Calculating -------------------------------------
  json-2.9.0-rstring     53.530k (± 1.6%) i/s   (18.68 μs/i) -    268.650k in   5.020019s

Comparison:
          json-2.9.0:    96002.0 i/s
  json-2.9.0-rstring:    53530.1 i/s - 1.79x  slower

== Encoding activitypub.json (52595 bytes)
ruby 3.4.0dev (2024-12-12T09:30:43Z master 197a3efc75) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
  json-2.9.0-rstring     1.060k i/100ms
Calculating -------------------------------------
  json-2.9.0-rstring     10.621k (± 0.3%) i/s   (94.15 μs/i) -     54.060k in   5.089908s

Comparison:
          json-2.9.0:    22854.8 i/s
  json-2.9.0-rstring:    10621.1 i/s - 2.15x  slower

== Encoding citm_catalog.json (500298 bytes)
ruby 3.4.0dev (2024-12-12T09:30:43Z master 197a3efc75) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
  json-2.9.0-rstring    62.000 i/100ms
Calculating -------------------------------------
  json-2.9.0-rstring    621.649 (± 0.5%) i/s    (1.61 ms/i) -      3.162k in   5.086598s

Comparison:
          json-2.9.0:     1354.1 i/s
  json-2.9.0-rstring:      621.6 i/s - 2.18x  slower

== Encoding twitter.json (466906 bytes)
ruby 3.4.0dev (2024-12-12T09:30:43Z master 197a3efc75) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
  json-2.9.0-rstring    97.000 i/100ms
Calculating -------------------------------------
  json-2.9.0-rstring    983.052 (± 1.0%) i/s    (1.02 ms/i) -      4.947k in   5.032796s

Comparison:
          json-2.9.0:     2175.2 i/s
  json-2.9.0-rstring:      983.1 i/s - 2.21x  slower

== Encoding canada.json (2090234 bytes)
ruby 3.4.0dev (2024-12-12T09:30:43Z master 197a3efc75) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
  json-2.9.0-rstring     1.000 i/100ms
Calculating -------------------------------------
  json-2.9.0-rstring     19.360 (± 0.0%) i/s   (51.65 ms/i) -     97.000 in   5.010646s

Comparison:
          json-2.9.0:       20.3 i/s
  json-2.9.0-rstring:       19.4 i/s - 1.05x  slower

== Encoding many #to_json calls (2701 bytes)
ruby 3.4.0dev (2024-12-12T09:30:43Z master 197a3efc75) +YJIT +PRISM [arm64-darwin23]
Warming up --------------------------------------
  json-2.9.0-rstring     2.108k i/100ms
Calculating -------------------------------------
  json-2.9.0-rstring     21.399k (± 1.0%) i/s   (46.73 μs/i) -    107.508k in   5.024491s

Comparison:
          json-2.9.0:    31034.7 i/s
  json-2.9.0-rstring:    21399.2 i/s - 1.45x  slower
```
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant