From 40724d7d10e9902fcdc4149326acbfe4dd95d3c7 Mon Sep 17 00:00:00 2001 From: Watson Date: Fri, 2 Mar 2018 00:51:30 +0900 Subject: [flori/json] Convert String encoding using `rb_str_encode()` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `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 ``` https://github.com/flori/json/commit/9ae6d2969c --- ext/json/generator/generator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ext/json/generator') diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c index cdf55c5ba4..e8b1476e31 100644 --- a/ext/json/generator/generator.c +++ b/ext/json/generator/generator.c @@ -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); -- cgit v1.2.3