Commit 6bb0775d authored by Kouhei Sutou's avatar Kouhei Sutou

Reduce needless Array generation in some String methods

Here are some benchmarks:

each_char:

    # /tmp/each_char.rb
    a = "a" * 1000000
    a.each_char do |x|
    end

Without this change:

    % time bin/mruby /tmp/each_char.rb
    bin/mruby /tmp/each_char.rb  1.07s user 0.02s system 99% cpu 1.088 total

With this change:

    % time bin/mruby /tmp/each_char.rb
    bin/mruby /tmp/each_char.rb  0.52s user 0.01s system 99% cpu 0.530 total

2 times faster with this change.

codepoints:

    # /tmp/codepoints.rb
    a = "a" * 1000000
    a.codepoints do |x|
    end

Without this change:

    % time bin/mruby /tmp/codepoints.rb
    bin/mruby /tmp/codepoints.rb  1.16s user 0.05s system 99% cpu 1.216 total

With this change:

    % time bin/mruby /tmp/codepoints.rb
    bin/mruby /tmp/codepoints.rb  0.56s user 0.02s system 99% cpu 0.589 total
parent 3757b16d
...@@ -354,7 +354,7 @@ class String ...@@ -354,7 +354,7 @@ class String
def chars(&block) def chars(&block)
if block_given? if block_given?
self.split('').map do |i| self.split('').each do |i|
block.call(i) block.call(i)
end end
self self
...@@ -366,7 +366,7 @@ class String ...@@ -366,7 +366,7 @@ class String
def each_char(&block) def each_char(&block)
return to_enum :each_char unless block return to_enum :each_char unless block
split('').map do |i| split('').each do |i|
block.call(i) block.call(i)
end end
self self
...@@ -376,7 +376,7 @@ class String ...@@ -376,7 +376,7 @@ class String
len = self.size len = self.size
if block_given? if block_given?
self.split('').map do|x| self.split('').each do|x|
block.call(x.ord) block.call(x.ord)
end end
self self
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment