Skip to content

Commit

Permalink
string.c: Improve String#prepend performance if only one argument is …
Browse files Browse the repository at this point in the history
…given

* string.c (rb_str_prepend_multi): Prepend the string without generating
    temporary String object if only one argument is given.
	This is very similar with #1634

	String#prepend -> 47.5 % up

    [Fix GH-1670] [ruby-core:82195] [Bug #13773]

* Before
      String#prepend      1.517M (± 1.8%) i/s -      7.614M in   5.019819s

* After
      String#prepend      2.236M (± 3.4%) i/s -     11.234M in   5.029716s

* Test code
require 'benchmark/ips'

Benchmark.ips do |x|
  x.report "String#prepend" do |loop|
    loop.times { "!".prepend("hello") }
  end
end

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60480 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
Watson1978 committed Oct 27, 2017
1 parent fd14454 commit b03a44c
Showing 1 changed file with 4 additions and 1 deletion.
5 changes: 4 additions & 1 deletion string.c
Expand Up @@ -3077,7 +3077,10 @@ rb_str_prepend_multi(int argc, VALUE *argv, VALUE str)
{
str_modifiable(str);

if (argc > 0) {
if (argc == 1) {
rb_str_update(str, 0L, 0L, argv[0]);
}
else if (argc > 1) {
int i;
VALUE arg_str = rb_str_tmp_new(0);
rb_enc_copy(arg_str, str);
Expand Down

0 comments on commit b03a44c

Please sign in to comment.