From: Erik Veenstra Date: 2006-08-15T04:01:03+09:00 Subject: Re: hash.keys and hash.values > Your test doesn't prove higher memory usage for the inject > version. The problem with the transpose approach is that you > need an additional copy of the complete hash in mem which is > not needed for inject. However, inject version is likely to > cause more GC because of all the two element arrays created. > You could retest this: > > keys, vals = [], [] hash.each {|k,v| keys << k; vals << v} > > This should be the most efficient approach - memory and > performance wise. Hihi... ;] Remember, both to_a and transpose are implemented in C. gegroet, Erik V. - http://www.erikveen.dds.nl/ PS: The circumstances are a bit different, compared to my previous post. Different environment, different numbers. ---------------------------------------------------------------- $ cat test.rb require "ev/ruby" GC.disable hash = {} 1000.times do |n| hash[n] = n*n end case ARGV.shift when "traditional" bm do 1000.times do keys = hash.keys values = hash.values end end when "transpose" bm do 1000.times do keys, values = hash.to_a.transpose end end when "inject" bm do 1000.times do keys, values = hash.inject([[],[]]){|(ks,vs),(k,v)| [ks << k, vs << v]} end end when "inject2" bm do 1000.times do keys, vals = [], [] hash.each {|k,v| keys << k; vals << v} end end else raise "uh?" end puts meminfo $ ruby test.rb traditional VmSize: 14296 kB CPU ELAPSED COUNT CPU/COUNT LABEL 0.300000 0.310413 1 0.300000 "test.rb:13" $ ruby test.rb transpose VmSize: 58280 kB CPU ELAPSED COUNT CPU/COUNT LABEL 0.760000 0.861536 1 0.760000 "test.rb:20" $ ruby test.rb inject VmSize: 146676 kB CPU ELAPSED COUNT CPU/COUNT LABEL 3.190000 3.331201 1 3.190000 "test.rb:26" $ ruby test.rb inject2 VmSize: 55244 kB CPU ELAPSED COUNT CPU/COUNT LABEL 1.690000 1.819222 1 1.690000 "test.rb:32" ----------------------------------------------------------------