Permalink
Browse files

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
  • Loading branch information...
kou committed Jul 27, 2016
1 parent 3757b16 commit 6bb0775d7603d020e64fb68fbc78e184745e8b0d
Showing with 3 additions and 3 deletions.
  1. +3 −3 mrbgems/mruby-string-ext/mrblib/string.rb
@@ -354,7 +354,7 @@ def upto(other_str, excl=false, &block)
def chars(&block)
if block_given?
self.split('').map do |i|
self.split('').each do |i|
block.call(i)
end
self
@@ -366,7 +366,7 @@ def chars(&block)
def each_char(&block)
return to_enum :each_char unless block
split('').map do |i|
split('').each do |i|
block.call(i)
end
self
@@ -376,7 +376,7 @@ def codepoints(&block)
len = self.size
if block_given?
self.split('').map do|x|
self.split('').each do|x|
block.call(x.ord)
end
self

0 comments on commit 6bb0775

Please sign in to comment.