Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Speed up Array#split

Benchmark:
          user     system      total        real
old   0.510000   0.000000   0.510000 (  0.506749)
new   0.330000   0.000000   0.330000 (  0.336187)
  • Loading branch information...
commit f660abce9a39a23dfa7494ca856f2ae9e824f806 1 parent 4536170
Akira Matsuda amatsuda authored
Showing with 20 additions and 6 deletions.
  1. +20 −6 activesupport/lib/active_support/core_ext/array/grouping.rb
26 activesupport/lib/active_support/core_ext/array/grouping.rb
View
@@ -86,13 +86,27 @@ def in_groups(number, fill_with = nil)
# [1, 2, 3, 4, 5].split(3) # => [[1, 2], [4, 5]]
# (1..10).to_a.split { |i| i % 3 == 0 } # => [[1, 2], [4, 5], [7, 8], [10]]
def split(value = nil, &block)
- inject([[]]) do |results, element|
- if block && block.call(element) || value == element
- results << []
- else
- results.last << element
- end
+ if block
+ inject([[]]) do |results, element|
+ if block.call(element)
+ results << []
+ else
+ results.last << element
+ end
+ results
+ end
+ else
+ results, arr = [[]], self
+ until arr.empty?
+ if (idx = index(value))
+ results.last.concat(arr.shift(idx))
+ arr.shift
+ results << []
+ else
+ results.last.concat(arr.shift(arr.size))
+ end
+ end
results
end
end
Please sign in to comment.
Something went wrong with that request. Please try again.