summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-array-ext/mrblib
diff options
context:
space:
mode:
authorChristopher Aue <[email protected]>2017-08-26 15:42:52 +0200
committerChristopher Aue <[email protected]>2017-08-26 15:57:25 +0200
commitc956e17c02d890ed96f640504f57eae0495f1f75 (patch)
tree1874af71ff598308afbd8f1110bd5ebdcf6f445c /mrbgems/mruby-array-ext/mrblib
parent6c9013e22b56f8a6b9bbd8ba2defa9db6a768401 (diff)
downloadmruby-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/mrblib')
-rw-r--r--mrbgems/mruby-array-ext/mrblib/array.rb49
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