このメソッドは少し長くなりますが、2倍速くなります
class Array
def find_each_index find
found, index, q = -1, -1, []
while found
found = self[index+1..-1].index(find)
if found
index = index + found + 1
q << index
end
end
q
end
end
arr = ['x', 'o', 'x', '.', '.', 'o', 'x']
p arr.find_each_index 'x'
# [0, 2, 6]
ここに、このソリューションでキャンピングされたAGSのベンチマークがあります
arr = 10000000.times.map{rand(1000)};
puts Benchmark.measure{arr.each_with_index.map { |a, i| a == 50 ? i : nil }.compact}
puts Benchmark.measure{(0..arr.size-1).select { |i| arr[i] == 50 }}
puts Benchmark.measure{arr.map.with_index {|a, i| a == 50 ? i : nil}.compact}
puts Benchmark.measure{arr.each_index.select{|i| arr[i] == 50}}
puts Benchmark.measure{arr.size.times.select {|i| arr[i] == 50}}
puts Benchmark.measure{arr.find_each_index 50}
# 1.263000 0.031000 1.294000 ( 1.267073)
# 0.843000 0.000000 0.843000 ( 0.846048)
# 0.936000 0.015000 0.951000 ( 0.962055)
# 0.842000 0.000000 0.842000 ( 0.839048)
# 0.843000 0.000000 0.843000 ( 0.843048)
# 0.405000 0.000000 0.405000 ( 0.410024)