On 16.07.2007 17:41, Florian Aann wrote:
> Robert Klemme schrieb:
>> 2007/7/16, Chris Carter <cdcarter / gmail.com>:
>>> On 7/16/07, James Edward Gray II <james / grayproductions.net> wrote:
>>>> On Jul 16, 2007, at 5:58 AM, hemant wrote:
>>>>
>>>>> a.inject({}) {|mem,(key,value)| mem[key] = {'name' => value}; mem }
>>>> I would write that as:
>>>>
>>>>    a.inject(Hash.new) { |h, (k, v)| h.merge(k => v) }
>>>>
>>>> James Edward Gray II
>>>>
>>>>
>>> But that doesn't yield what he wanted... You could do
>>> a.inject(Hash.new){|h,(k,v)| h.merge(k => { 'name' => value})}
>> Still it's inefficient because of all the small Hashes that are thrown
>> away immediately. The solution provided by hemant is better although
>> not as elegant.
>>
>> Kind regards
>>
>> robert
>>
>>
> 
> Hi,
> 
> I also tested a theory of mine, Hash#update does this ~20% faster than
> Hash#each:
> 
> hash.update(hash) { |key, o_val, n_val| Hash['name' => o_val] }
> 
> Thread ID: 101250
> Total: 7.24
> 
>  %self     total     self     wait    child    calls  name
>  66.16      7.24     4.79     0.00     2.45        1  Hash#update
>  33.84      2.45     2.45     0.00     0.00   456976  <Class::Hash>#[]
>   0.00      7.24     0.00     0.00     7.24        0  Global#[No method]
> 
> hash.each { |key, value| hash[key] = Hash['name' => value] }
> 
> Thread ID: 101250
> Total: 9.28
> 
>  %self     total     self     wait    child    calls  name
>  60.78      9.28     5.64     0.00     3.64        1  Hash#each
>  26.62      2.47     2.47     0.00     0.00   456976  <Class::Hash>#[]
>  12.61      1.17     1.17     0.00     0.00   456976  Hash#[]=
>   0.00      9.28     0.00     0.00     9.28        0  Global#[No method]
> 
> As I profiled both cases I came across something I don't understand:
> When I do the profiling of both cases In the same Ruby process the later
> one always is slower as when I profile them seperatly, can somebody
> explain this?

I'd guess it's GC.  IMHO for comparing performance Benchmark is a better 
tool - especially since you can have a warmup run.

Kind regards

	robert