Skip to content

Commit 9bef2bd

Browse files
committed
Remove unnecessary initialization of create_id in JSON.parse()
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 ```
1 parent 4423186 commit 9bef2bd

2 files changed

Lines changed: 2 additions & 2 deletions

File tree

ext/json/ext/parser/parser.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2904,7 +2904,7 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
29042904
json->max_nesting = 100;
29052905
json->allow_nan = 0;
29062906
json->create_additions = 0;
2907-
json->create_id = rb_funcall(mJSON, i_create_id, 0);
2907+
json->create_id = Qnil;
29082908
json->object_class = Qnil;
29092909
json->array_class = Qnil;
29102910
json->decimal_class = Qnil;

ext/json/ext/parser/parser.rl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -804,7 +804,7 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
804804
json->max_nesting = 100;
805805
json->allow_nan = 0;
806806
json->create_additions = 0;
807-
json->create_id = rb_funcall(mJSON, i_create_id, 0);
807+
json->create_id = Qnil;
808808
json->object_class = Qnil;
809809
json->array_class = Qnil;
810810
json->decimal_class = Qnil;

0 commit comments

Comments
 (0)