ruby-changes:46771
From: k0kubun <ko1@a...>
Date: Thu, 25 May 2017 20:14:45 +0900 (JST)
Subject: [ruby-changes:46771] k0kubun:r58886 (trunk): string.c: Optimize String#concat when argc is 1
k0kubun 2017-05-25 20:14:40 +0900 (Thu, 25 May 2017) New Revision: 58886 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=58886 Log: string.c: Optimize String#concat when argc is 1 Optimize performance regression introduced in r56021. * Benchmark (i7-4790K @ 4.00GH, x86_64 GNU/Linux) Benchmark.ips do |x| x.report("String#concat (1)") { "a".concat("b") } if RUBY_VERSION >= "2.4.0" x.report("String#concat (2)") { "a".concat("b", "c") } end end * Ruby 2.3 Calculating ------------------------------------- String#concat (1) 6.003M (?\194?\177 5.2%) i/s - 30.122M in 5.031646s * Ruby 2.4 (Before this patch) Calculating ------------------------------------- String#concat (1) 4.458M (?\194?\177 8.9%) i/s - 22.298M in 5.058084s String#concat (2) 3.660M (?\194?\177 5.6%) i/s - 18.314M in 5.020527s * Ruby 2.4 (After this patch) Calculating ------------------------------------- String#concat (1) 6.448M (?\194?\177 5.2%) i/s - 32.215M in 5.010833s String#concat (2) 3.633M (?\194?\177 9.0%) i/s - 18.056M in 5.022603s [fix GH-1631] Modified files: trunk/string.c Index: string.c =================================================================== --- string.c (revision 58885) +++ string.c (revision 58886) @@ -2935,7 +2935,9 @@ rb_str_concat_multi(int argc, VALUE *arg https://github.com/ruby/ruby/blob/trunk/string.c#L2935 { str_modifiable(str); - if (argc > 0) { + if (argc == 1) { + return rb_str_concat(str, argv[0]); + } else if (argc > 1) { int i; VALUE arg_str = rb_str_tmp_new(0); rb_enc_copy(arg_str, str); -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/