ruby-changes:4024
From: ko1@a...
Date: Sun, 17 Feb 2008 09:18:34 +0900 (JST)
Subject: [ruby-changes:4024] akr - Ruby:r15514 (trunk): * string.c (rb_str_times): reduce loop overhead.
akr 2008-02-17 09:18:16 +0900 (Sun, 17 Feb 2008) New Revision: 15514 Modified files: trunk/ChangeLog trunk/string.c trunk/test/ruby/test_string.rb Log: * string.c (rb_str_times): reduce loop overhead. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/ruby/test_string.rb?r1=15514&r2=15513&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/string.c?r1=15514&r2=15513&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15514&r2=15513&diff_format=u Index: ChangeLog =================================================================== --- ChangeLog (revision 15513) +++ ChangeLog (revision 15514) @@ -1,3 +1,7 @@ +Sun Feb 17 09:17:08 2008 Tanaka Akira <akr@f...> + + * string.c (rb_str_times): reduce loop overhead. + Sun Feb 17 03:37:01 2008 Tanaka Akira <akr@f...> * include/ruby/re.h (struct rmatch_offset): new struct for character Index: string.c =================================================================== --- string.c (revision 15513) +++ string.c (revision 15514) @@ -762,7 +762,7 @@ rb_str_times(VALUE str, VALUE times) { VALUE str2; - long i, len; + long n, len; len = NUM2LONG(times); if (len < 0) { @@ -773,9 +773,14 @@ } str2 = rb_str_new5(str, 0, len *= RSTRING_LEN(str)); - for (i = 0; i < len; i += RSTRING_LEN(str)) { - memcpy(RSTRING_PTR(str2) + i, - RSTRING_PTR(str), RSTRING_LEN(str)); + if (len) { + n = RSTRING_LEN(str); + memcpy(RSTRING_PTR(str2), RSTRING_PTR(str), n); + while (n <= len/2) { + memcpy(RSTRING_PTR(str2) + n, RSTRING_PTR(str2), n); + n *= 2; + } + memcpy(RSTRING_PTR(str2) + n, RSTRING_PTR(str2), len-n); } RSTRING_PTR(str2)[RSTRING_LEN(str2)] = '\0'; OBJ_INFECT(str2, str); Index: test/ruby/test_string.rb =================================================================== --- test/ruby/test_string.rb (revision 15513) +++ test/ruby/test_string.rb (revision 15514) @@ -174,7 +174,7 @@ s = "a" 10.times {|i| s << s - assert_equal("a" * (2<<i), s) + assert_equal("a" * (2 << i), s) } end @@ -1370,4 +1370,13 @@ def test_end_with? assert("abc".end_with?("c")) end + + def test_times + s1 = '' + 100.times {|n| + s2 = "a" * n + assert_equal(s1, s2) + s1 << 'a' + } + end end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/