--rz+pwK2yUstbofK6 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Mon, Jun 11, 2007 at 04:05:10PM +0900, Robert Klemme wrote: > On 11.06.2007 07:41, Anthony Martinez wrote: > >So, I was tinkering with ways to build a hash out of transforming an [snip] > >Also, I just thought of a similar way to accomplish the same thing: > >x.report("zip") { Hash[ *id_list.zip(id_list.collect {|e| e.object_id})] } > >Array#collect! won't work right with this, of course, but it seems to > >have equally-bad performance. Is Array#inject just optimized for this, > >or something? > > The reason why you are seeing this (performance as well as timing) is > most likely caused by the different approach. When you use #inject > you just create one copy of the Array (the Hash). When you use > #collect you create at least one additional copy of the large array > plus a ton of two element arrays. That's way less efficient Ah. This does make sense. Now, I throw in the #zip variant! > considering memory usage and GC. You'll probably see much different > results if your input array is much shorter (try with 10 or 100 > elements). Well, the general trend is that any of the non-idiomatic solutions are pretty horrible, although the two-bang gets vaguely better than 0 or 1 on bigger arrays: 1000 elements: Rehearsal -------------------------------------------- inject 0.010000 0.000000 0.010000 ( 0.007391) non-bang 0.000000 0.000000 0.000000 ( 0.006602) bang 0.000000 0.000000 0.000000 ( 0.008503) two-bang 0.010000 0.000000 0.010000 ( 0.010136) zip 0.790000 0.220000 1.010000 ( 1.202124) ----------------------------------- total: 1.030000sec user system total real inject 0.010000 0.010000 0.020000 ( 0.012621) non-bang 0.020000 0.000000 0.020000 ( 0.022407) bang 0.020000 0.000000 0.020000 ( 0.019274) two-bang 0.020000 0.000000 0.020000 ( 0.027521) zip 2.240000 0.670000 2.910000 ( 5.804656) 10000 elements: Rehearsal -------------------------------------------- inject 0.050000 0.010000 0.060000 ( 0.079325) non-bang 0.140000 0.010000 0.150000 ( 0.265995) bang 0.150000 0.010000 0.160000 ( 0.184713) two-bang 0.140000 0.020000 0.160000 ( 0.202579) zip 77.510000 24.270000 101.780000 (134.493519) --------------------------------- total: 102.310000sec user system total real inject 0.110000 0.030000 0.140000 ( 0.146650) non-bang 0.450000 0.020000 0.470000 ( 0.526816) bang 0.470000 0.020000 0.490000 ( 0.583837) two-bang 0.440000 0.040000 0.480000 ( 0.520914) zip 222.910000 69.370000 292.280000 (389.541023) Extra-ouch! This is what I get for trying to be clever. > > Kind regards > > robert > -- Too many errors on one line (make fewer) -- Apple MPW C compiler --rz+pwK2yUstbofK6 Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) iD8DBQFGbPheKaiGM/xGKzQRAqDTAJ0S/iGw/h/uJFZfelvmn9fXm44k8QCfZzcM j/X79OEPP0+1qoqj4Uz9cw8 R4 -----END PGP SIGNATURE----- --rz+pwK2yUstbofK6--