Skip to content

Commit

Permalink
Add shortcut converting to String
Browse files Browse the repository at this point in the history
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
```
  • Loading branch information
Watson1978 authored and flori committed Apr 29, 2019
1 parent a73323d commit 38c0f6d
Showing 1 changed file with 9 additions and 2 deletions.
11 changes: 9 additions & 2 deletions ext/json/ext/generator/generator.c
Expand Up @@ -740,7 +740,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) {
Expand All @@ -752,7 +752,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);
Expand Down

0 comments on commit 38c0f6d

Please sign in to comment.