[ruby-it] Quattro interpreti ruby a confronto

Paolo Montrasio paolo a paolomontrasio.com
Lun 17 Ago 2009 09:03:24 CEST


Ciao Marco,

nel codice misurato dal mio benchmark avevo deciso di includere anche 
Array.<< perché ritenevo che l'inizializzazione dell'array fosse parte 
integrante dell'operazione di concatenazione.

Sia con l'array che con (ad esempio) String.+ si parte con delle 
stringhe e poi c'è l'operazione da misurare che per String.+ è 
semplicemente farne la somma mentre nell'altro caso si deve mettere le 
stringhe in un array e farne una join.
Dal mio punto di vista saltare l'inizializzazione dell'array favoriva 
indebitamente Array.join rispetto agli altri metodi.

Fortunamente non è questione di punti di vista, altrimenti potremmo 
discuterne per l'eternità, ma di come saranno fatte le nostre 
applicazioni reali. Se le stringhe con cui lavoreremo sono già in un 
array, dal tuo benchmark sappiamo che la join è sicuramente preferibile 
a a[0]+a[1]+etc. Se non sono in un array, dal mio benchmark sappiamo che 
per stringhe piccole conviene usare la concatenazione e non crearsi 
l'array per farne la join.

In sostanza avevamo pensato a due scenari differenti e quindi abbiamo 
ragione tutti e due :-)

Riporto infine i risultati del tuo benchmark sul mio pc che come cpu è 
identico al tuo. Ho più RAM (ma durante il benchmark ho sempre avuto 
liberi almeno 1.8 GB), un OS differente (Ubuntu 8.10 64 bit) e ruby 
1.8.7.

                           user     system      total        real
1.000.000 iterations:
'1000'.create:
'%01000d' % 0          3.560000   0.190000   3.750000 (  3.753813)
0 * 1000               9.760000   0.110000   9.870000 ( 10.004395)
'4000'.create:
'%04000d' % 0          7.040000   0.190000   7.230000 (  7.247626)
0 * 4000              37.950000   4.840000  42.790000 ( 42.877476)
1000: str vs [].join:
+                     23.570000   0.560000  24.130000 ( 24.184767)
#{}                   10.160000   0.190000  10.350000 ( 10.368516)
<<                    13.550000   0.180000  13.730000 ( 13.752579)
[].join                4.620000   0.750000   5.370000 (  5.412506)
--- Total:            76.480000   6.260000  82.740000 ( 83.048395)

Da me gira in 76 s contro 100 s da te. Mi chiedo se la differenza sia 
dovuta alla versione di ruby o a come sono stati compilati gli 
interpreti per Windows e per Linux. Non credo che l'OS c'entri in 
qualche modo dato che stiamo misurando operazioni CPU bound. Da quel che 
ho googlato non c'è accordo se la 1.8.6 sia più o meno veloce della 
1.8.7. Quel che so è che apparentemente su Linux conviene compilarsi 
l'interprete, cosa che faccio in produzione ma non sul mio pc di 
sviluppo dove ho fatto girare il benchmark. Secondo 
http://antoniocangiano.com/2008/12/10/reflections-on-the-ruby-shootout/ 
si ottiene un raddoppio di velocità.

Paolo
-- 
Posted via http://www.ruby-forum.com/.


More information about the Ml mailing list