Skip to content

Commit 9ae6d29

Browse files
Watson1978flori
authored andcommitted
Convert String encoding using rb_str_encode()
`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 ```
1 parent 38c0f6d commit 9ae6d29

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

ext/json/ext/generator/generator.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -846,7 +846,7 @@ static void generate_json_string(FBuffer *buffer, VALUE Vstate, JSON_Generator_S
846846
{
847847
fbuffer_append_char(buffer, '"');
848848
#ifdef HAVE_RUBY_ENCODING_H
849-
obj = rb_funcall(obj, i_encode, 1, CEncoding_UTF_8);
849+
obj = rb_str_encode(obj, CEncoding_UTF_8, 0, Qnil);
850850
#endif
851851
if (state->ascii_only) {
852852
convert_UTF8_to_JSON_ASCII(buffer, obj);

0 commit comments

Comments
 (0)