That segfault shouldn't be happening... I guess you've found a bug. I
modified your benchmark slightly (reduced id_list to 100_000 elements,
since I don't want to wait more than an hour for it to finish) and I
didn't get a segfault, but the results are definitely strange:
Rehearsal --------------------------------------------
inject 0.320000 0.350000 0.670000 ( 0.682610)
non-bang 7.700000 0.590000 8.290000 ( 8.522170)
bang 7.150000 0.230000 7.380000 ( 7.392471)
two-bang 6.500000 0.220000 6.720000 ( 6.766079)
---------------------------------- total: 23.060000sec
user system total real
inject 0.700000 0.310000 1.010000 ( 1.019340)
non-bang 131.260000 1.440000 132.700000 (132.823762)
bang 134.610000 1.280000 135.890000 (136.323224)
two-bang 137.260000 0.750000 138.010000 (138.027025)
Why is the rehearsal so much faster? Especially for the various
collect implementations?
(I'm running Debian Etch, Ruby 1.8.5.)
I expect that the fastest way to do what you want is like this:
id_list = [:test1, :test2, :test3]
result={}
id_list.each { |e| result[e]=e.object_id }
Anyway, that's what I usually do.
I have several times wanted a method on Enumerable that helps you
transform it into a hash. Something like:
module Enumerable
def map_to_hash
result={}
each { |e|
k,v=*yield(e)
result[k]=v
}
return result
end
end
id_list.map_to_hash {|x| [x,x.object_id]}
I don't know what the performance of this might be.... It's creating a
2-element hash on each loop now, but maybe that has minimal cost.