Skip to content

Commit

Permalink
[flori/json] Convert String encoding using rb_str_encode()
Browse files Browse the repository at this point in the history
`rb_funcall` might be slightly heavy to call the Ruby method.
This patch will convert String encoding using `rb_str_encode()` instead of `rb_funcall()`.

## Before
```
$ 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
```

## After
```
$ ruby bench_json_generate.rb
Warming up --------------------------------------
                json   129.000  i/100ms
Calculating -------------------------------------
                json      1.300k (± 2.3%) i/s -      6.579k in   5.064656s
```

## Code
```
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
```

flori/json@9ae6d2969c
  • Loading branch information
Watson1978 authored and nobu committed Oct 14, 2019
1 parent 641136c commit 40724d7
Showing 1 changed file with 1 addition and 1 deletion.
2 changes: 1 addition & 1 deletion ext/json/generator/generator.c
Expand Up @@ -810,7 +810,7 @@ static void generate_json_string(FBuffer *buffer, VALUE Vstate, JSON_Generator_S
{
fbuffer_append_char(buffer, '"');
#ifdef HAVE_RUBY_ENCODING_H
obj = rb_funcall(obj, i_encode, 1, CEncoding_UTF_8);
obj = rb_str_encode(obj, CEncoding_UTF_8, 0, Qnil);
#endif
if (state->ascii_only) {
convert_UTF8_to_JSON_ASCII(buffer, obj);
Expand Down

0 comments on commit 40724d7

Please sign in to comment.