Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove unnecessary initialization of create_id in JSON.parse() #454

Merged
merged 1 commit into from Dec 1, 2023

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.

* * *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.

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
Collaborator

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
  > flori/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>

  > flori/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.

None yet

2 participants