diff options
author | Watson <watson1978@gmail.com> | 2018-03-02 00:45:28 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2019-10-14 19:54:49 +0900 |
commit | 98a9445db943c747e8d98cf7236e891eb48b5be0 (patch) | |
tree | 75e6a7c492f6235be34b631834bd8279c1022975 /ext/json | |
parent | a2f9c38a718eecef6795b4a8667589c0ef68b737 (diff) |
[flori/json] Add shortcut converting to String
In where to convert Hash key to String for json, this patch will add shortcut for String/Symbol in Hash key.
```
$ ruby bench_json_generate.rb
Warming up --------------------------------------
json 65.000 i/100ms
Calculating -------------------------------------
json 659.576 (± 1.5%) i/s - 3.315k in 5.027127s
```
```
$ ruby bench_json_generate.rb
Warming up --------------------------------------
json 78.000 i/100ms
Calculating -------------------------------------
json 789.781 (± 2.7%) i/s - 3.978k in 5.041043s
```
```
require 'json'
require 'benchmark/ips'
obj = []
1000.times do |i|
obj << {
"id" => i,
:age => 42,
}
end
Benchmark.ips do |x|
x.report "json" do |iter|
count = 0
while count < iter
JSON.generate(obj)
count += 1
end
end
end
```
https://github.com/flori/json/commit/38c0f6dbe4
Diffstat (limited to 'ext/json')
-rw-r--r-- | ext/json/generator/generator.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c index 165ca10794..9bbda28fc7 100644 --- a/ext/json/generator/generator.c +++ b/ext/json/generator/generator.c @@ -744,7 +744,7 @@ json_object_i(VALUE key, VALUE val, VALUE _arg) long delim2_len = FBUFFER_LEN(state->object_delim2); long depth = state->depth; int j; - VALUE key_to_s; + VALUE klass, key_to_s; if (arg->iter > 0) fbuffer_append(buffer, delim, delim_len); if (object_nl) { @@ -756,7 +756,14 @@ json_object_i(VALUE key, VALUE val, VALUE _arg) } } - key_to_s = rb_funcall(key, i_to_s, 0); + klass = CLASS_OF(key); + if (klass == rb_cString) { + key_to_s = key; + } else if (klass == rb_cSymbol) { + key_to_s = rb_id2str(SYM2ID(key)); + } else { + key_to_s = rb_funcall(key, i_to_s, 0); + } Check_Type(key_to_s, T_STRING); generate_json(buffer, Vstate, state, key_to_s); fbuffer_append(buffer, delim2, delim2_len); |