1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

[flori/json] Convert string encoding to UTF-8 only when needed

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

## After
```
$ ruby bench_json_generate.rb
Warming up --------------------------------------
                json   189.000  i/100ms
Calculating -------------------------------------
                json      1.964k (± 3.3%) i/s -      9.828k in   5.011237s
```

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

https://github.com/flori/json/commit/c34d01ff6a
This commit is contained in:
Watson 2018-03-03 01:16:34 +09:00 committed by Nobuyoshi Nakada
parent 40724d7d10
commit d7fa7e2c86
No known key found for this signature in database
GPG key ID: 4BC7D6DF58D8DF60

View file

@ -810,7 +810,9 @@ static void generate_json_string(FBuffer *buffer, VALUE Vstate, JSON_Generator_S
{
fbuffer_append_char(buffer, '"');
#ifdef HAVE_RUBY_ENCODING_H
obj = rb_str_encode(obj, CEncoding_UTF_8, 0, Qnil);
if (!rb_enc_str_asciicompat_p(obj)) {
obj = rb_str_encode(obj, CEncoding_UTF_8, 0, Qnil);
}
#endif
if (state->ascii_only) {
convert_UTF8_to_JSON_ASCII(buffer, obj);