diff options
| author | Christopher Aue <[email protected]> | 2017-08-26 15:42:52 +0200 |
|---|---|---|
| committer | Christopher Aue <[email protected]> | 2017-08-26 15:57:25 +0200 |
| commit | c956e17c02d890ed96f640504f57eae0495f1f75 (patch) | |
| tree | 1874af71ff598308afbd8f1110bd5ebdcf6f445c /mrbgems/mruby-array-ext | |
| parent | 6c9013e22b56f8a6b9bbd8ba2defa9db6a768401 (diff) | |
| download | mruby-c956e17c02d890ed96f640504f57eae0495f1f75.tar.gz mruby-c956e17c02d890ed96f640504f57eae0495f1f75.zip | |
Replaced Array#each with while loop for performance reasons
Example benchmark:
$ time build/bench/bin/mruby -e "Array.new(2_000_000){ |i| i }.index{ |i| i == 1_999_999 }"
Before:
real 0m0.934s
user 0m0.922s
sys 0m0.003s
After:
real 0m0.590s
user 0m0.583s
sys 0m0.007s
Diffstat (limited to 'mrbgems/mruby-array-ext')
| -rw-r--r-- | mrbgems/mruby-array-ext/mrblib/array.rb | 49 |
1 files changed, 39 insertions, 10 deletions
diff --git a/mrbgems/mruby-array-ext/mrblib/array.rb b/mrbgems/mruby-array-ext/mrblib/array.rb index 21ef6791b..e28e5238d 100644 --- a/mrbgems/mruby-array-ext/mrblib/array.rb +++ b/mrbgems/mruby-array-ext/mrblib/array.rb @@ -101,8 +101,19 @@ class Array hash = {} array = [] - elem.each { |x| hash[x] = true } - self.each { |x| array << x unless hash[x] } + idx = 0 + len = elem.size + while idx < len + hash[elem[idx]] = true + idx += 1 + end + idx = 0 + len = size + while idx < len + v = self[idx] + array << v unless hash[v] + idx += 1 + end array end @@ -137,12 +148,21 @@ class Array hash = {} array = [] - elem.each{|v| hash[v] = true } - self.each do |v| + idx = 0 + len = elem.size + while idx < len + hash[elem[idx]] = true + idx += 1 + end + idx = 0 + len = size + while idx < len + v = self[idx] if hash[v] array << v hash.delete v end + idx += 1 end array end @@ -190,13 +210,17 @@ class Array def flatten!(depth=nil) modified = false ar = [] - self.each do |e| + idx = 0 + len = size + while idx < len + e = self[idx] if e.is_a?(Array) && (depth.nil? || depth > 0) ar += e.flatten(depth.nil? ? nil : depth - 1) modified = true else ar << e end + idx += 1 end if modified self.replace(ar) @@ -718,10 +742,14 @@ class Array return to_enum :select! unless block result = [] - self.each do |x| - result << x if block.call(x) + idx = 0 + len = size + while idx < len + elem = self[idx] + result << elem if block.call(elem) + idx += 1 end - return nil if self.size == result.size + return nil if len == result.size self.replace(result) end @@ -743,8 +771,9 @@ class Array if block idx = 0 - self.each do |*e| - return idx if block.call(*e) + len = size + while idx < len + return idx if block.call self[idx] idx += 1 end else |
