Skip to content

Conversation

@Watson1978
Copy link
Contributor

The create_id has no effect if create_additions is false.

    • create_additions: If set to false, the Parser doesn't create
  • additions even if a matching class and create_id was found. This option
  • defaults to false.

https://github.com/flori/json/blob/8f7ddba3cd343c2bada3c31c9660c63f0c6df114/ext/json/ext/parser/parser.c#L1758-L1760

So, this PR will remove initialization of create_id when create_additions is false.
This PR will improve JSON.parse() performance about 6%.

Environment

  • MacBook Pro (16-inch, 2019)
  • macOS 11.1
  • Intel Core i9 2.4 GHz
  • Ruby 2.7.2

Before

Warming up --------------------------------------
   short_string_json    10.920k i/100ms
    long_string_json    10.326k i/100ms
Calculating -------------------------------------
   short_string_json    107.833k (± 1.1%) i/s -    546.000k in   5.064049s
    long_string_json    103.035k (± 0.9%) i/s -    516.300k in   5.011344s

After

Warming up --------------------------------------
   short_string_json    11.654k i/100ms
    long_string_json    11.021k i/100ms
Calculating -------------------------------------
   short_string_json    115.564k (± 0.7%) i/s -    582.700k in   5.042516s
    long_string_json    109.216k (± 0.6%) i/s -    551.050k in   5.045726s

Test code

require 'benchmark/ips'
require 'json'

short_string_json = {
  "a" => "b" * 23,
  "a" * 23 => "b"
}.to_json.freeze

long_string_json = {
  "a" => "b" * 50,
  "a" * 50 => "b"
}.to_json.freeze

Benchmark.ips do |x|
  x.report("short_string_json") { JSON.parse(short_string_json) }
  x.report("long_string_json") { JSON.parse(long_string_json) }
end

The `create_id` has no effect if `create_additions` is false.

> * * *create_additions*: If set to false, the Parser doesn't create
> *   additions even if a matching class and create_id was found. This option
> *   defaults to false.

https://github.com/flori/json/blob/8f7ddba3cd343c2bada3c31c9660c63f0c6df114/ext/json/ext/parser/parser.c#L1758-L1760

So, this PR will remove initialization of `create_id` when `create_additions` is false.
This PR will improve JSON.parse() performance about 6%.

### Environment
- MacBook Pro (16-inch, 2019)
- macOS 11.1
- Intel Core i9 2.4 GHz
- Ruby 2.7.2

### Before
```
Warming up --------------------------------------
   short_string_json    10.920k i/100ms
    long_string_json    10.326k i/100ms
Calculating -------------------------------------
   short_string_json    107.833k (± 1.1%) i/s -    546.000k in   5.064049s
    long_string_json    103.035k (± 0.9%) i/s -    516.300k in   5.011344s
```

### After
```
Warming up --------------------------------------
   short_string_json    11.654k i/100ms
    long_string_json    11.021k i/100ms
Calculating -------------------------------------
   short_string_json    115.564k (± 0.7%) i/s -    582.700k in   5.042516s
    long_string_json    109.216k (± 0.6%) i/s -    551.050k in   5.045726s
```

### Test code
```ruby
require 'benchmark/ips'
require 'json'

short_string_json = {
  "a" => "b" * 23,
  "a" * 23 => "b"
}.to_json.freeze

long_string_json = {
  "a" => "b" * 50,
  "a" * 50 => "b"
}.to_json.freeze

Benchmark.ips do |x|
  x.report("short_string_json") { JSON.parse(short_string_json) }
  x.report("long_string_json") { JSON.parse(long_string_json) }
end
```
@hsbt
Copy link
Member

hsbt commented Dec 1, 2023

👍

@Watson1978 Watson1978 deleted the create_id branch December 1, 2023 06:49
matzbot pushed a commit to ruby/ruby that referenced this pull request Dec 1, 2023
  > ruby/json#525
  > Rename escape_slash in script_safe and also escape E+2028 and E+2029

  Co-authored-by: Jean Boussier <jean.boussier@gmail.com>

  > ruby/json#454
  > Remove unnecessary initialization of create_id in JSON.parse()

  Co-authored-by: Watson <watson1978@gmail.com>
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.

2 participants