Archivio per il mese di dicembre 2007



Buon Natale! Merry Christmas! メリークリスマス!Etc.

Dal momento che il titolo dice già tutto ciò che avevo intenzione di dirvi, sarò molto breve e non farò altro che ripetermi augurando a tutti voi di passare delle buone feste. Ciao!

Ruby 1.9.0 in arrivo…

Il conto alla rovescia è ormai cominciato: tra meno di una dozzina di ore farà capolino la nuova major release di Ruby. Il rilascio di questa nuova versione, salvo imprevisti dell’ultimo minuto, è programmato per le 15.00 JST (le 7.00 di mattina ora italiana) e, come sottolineato da Matz, quella che verrà distribuita sarà appunto la versione 1.9.0 e non la 1.9.1 come da roadmap. Il motivo di questa variazione di programma rispetto ai piani è semplicemente legato al fatto che, pur avendo completato e implementato tutti i cambiamenti previsti per questa release, la stabilità nel suo insieme risulta essere inferiore rispetto alle aspettative e ci sono già alcuni bug conosciuti che verranno indicati nelle note di rilascio. Si tratterà comunque della prima vera occasione per iniziare il porting dei propri script e applicazioni dal momento che è stata introdotta una nutrita quantità di cambiamenti, tantissimi piccoli e alcuni grossi, che rendono questa versione deliberatamente incompatibile, pertanto la 1.8 rimarrà ancora per un po’ di mesi la versione di riferimento in ambito di produzione. Tre delle più importanti novità di Ruby 1.9 sono la nuova VM (ex YARV), il supporto per unicode e il passaggio da green-thread a thread nativi (seppur con qualche limitazione volutamente imposta, il nuovo modello di threading arriverà nella sua completezza solo con Ruby 2.0), il tutto seguito a ruota da una vasta lista di cambiamenti più o meno piccoli che potete trovare elencati in maniera piuttosto completa in questa pagina. Preparatevi…

Don’t forget to read the Stacktrace!

In attesa di poter tornare con un po’ di attività degna di nota per questo blog (le ultime tre settimane sono state un bagno di sangue di impegni lavorativi) vorrei segnalarvi la nascita di Stacktrace, un progetto tutto italiano dedicato all’informazione nel mondo dell’IT con news di vario genere e articoli tecnici ad ampio respiro, il tutto senza scimmiottare o limitarsi a riprendere banalmente notizie già pubblicate altrove. Nonostante abbia appena aperto i battenti Stacktrace sta già producendo contenuti estremamente interessanti ma del resto non poteva che essere altrimenti visti i professionisti e grandi appassionati che compongono lo staff di redattori e autori. Vi consiglio vivamente di dare un’occhiata al materiale già pubblicato, perché ci sono alcune chicche come questa che secondo me valgono la sottoscrizione al feed ad occhi chiusi.

Ecco che arriva un’altra bolla…

Una divertentissima parodia, tra l’altro azzeccatissima, del uebb due punto zero segnalata da Scott Hanselman sul suo blog. Ho riso talmente tanto che non potevo non riportarvela :-)

Microbenchmark: Ruby 1.9.0 contro tutti (… non proprio…)

Il rilascio di Ruby 1.9 è previsto intorno a Natale e con il passare dei giorni la curiosità dei rubyisti si fa sempre più intensa. Stuzzicato da un microbenchmark pubblicato da Antonio Cangiano sul suo blog in cui ha messo a confronto la velocità di esecuzione di Ruby 1.8.6, Ruby 1.9.0 e Python 2.5.1 usando volutamente una funzione ricorsiva che calcolasse i primi 35 numeri della successione di Fibonacci, ho pensato che sarebbe stato interessante fare lo stesso test con i suoi script ma con condizioni diverse. A differenza di Antonio, che ha eseguito il suddetto microbenchmark sul suo MacBook Pro con OS X 10.5, ho pensato di effettuare i miei test su Windows chiamando in causa a questo punto anche IronRuby e, tanto per fare, anche PHP e Lua. Mi sarebbe piaciuto provare anche JRuby, ma purtroppo non ho nessuna esperienza e non saprei nemmeno da dove cominciare.

  • Configurazione: Microsoft Windows XP SP2 (x86) – AMD Athlon64 3700+ (2,2 GHz) – 2 GB RAM
  • Dettaglio versioni:
    • Ruby 1.9.0 (SVN rev. 14067 compilata con VC++ 2005)
      ruby 1.9.0 (2007-12-01 patchlevel 0) [i386-mswin32_80]
    • Ruby 1.8.6 (Ruby OneClick Installer 1.8.6-25)
      ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
    • IronRuby 1.0 pre-alpha (SVN rev. 65 compilata con CSC di VS 2005)
      IronRuby Pre-Alpha (1.0.0.0) on .NET 2.0.50727.832
    • Python 2.5.1 (Standard Python 2.5.1 Windows Installer)
      Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)]
    • Python 3.0a1 (Standard Python 3.0a1 Windows Installer)
      Python 3.0a1 (py3k:57844, Aug 31 2007, 16:54:27) [MSC v.1310 32 bit (Intel)]
    • PHP 5.2.5 (Binari ufficiali per Win32 – versione TS – no debug – Zend Engine 2.2.0)
      PHP 5.2.5 (cli) (built: Nov  8 2007 23:18:51)
    • PHP 5.3.0 (Snapshot ufficiale – versione TS – no debug – Zend Engine 2.3.0)
      PHP 5.3.0-dev (cli) (built: Dec  1 2007 04:19:04)
    • PHP 6.0.0 (Snapshot ufficiale – versione TS – no debug – Zend Engine 3.0.0-dev)
      PHP 6.0.0-dev (cli) (built: Dec  1 2007 02:04:58)
    • Lua 5.1.2 (LuaBinaries per Win32 di LuaForge)
      Lua 5.1.2  Copyright (C) 1994-2007 Lua.org, PUC-Rio

Le build di Ruby 1.9 e IronRuby sono state effettuate direttamente da me allineandomi questa mattina con i trunk nei rispettivi repository SVN, nel primo caso senza badare a ottimizzazioni particolari e nel secondo caso usando la modalità release. Per le versioni di sviluppo di PHP ho prelevato questa mattina da snaps.php.net i binari ufficiali e ho effettuato i test con la configurazione (php.ini) di default, così come per la versione stabile 5.2.5. Lo script per Python è stato leggermente modificato per la versione 3.0 dal momento che print è diventata una funzione e funziona diversamente dalla versione 2.5.

Gli script usati per Ruby, IronRuby e Python sono gli stessi di Antonio, aggiungo solo le mie varianti Lua e PHP (occhio, si tratta solamente di un becero port ai rispettivi linguaggi). Ecco come si presenta la versione in Lua:

function fib(n) if n == 0 or n == 1 then return n end return fib(n - 1) + fib(n - 2) end for n = 0, 35 do print("n=" .. n .. " => " .. fib(n)) end

Ed ecco invece la versione in PHP:

function fib($n) { if ($n == 0 || $n == 1) return $n; return fib($n - 1) + fib($n - 2); } for ($i = 0; $i <= 35; $i++) echo "n=", $i, " => ", fib($i), "\n";

I tempi riportati di seguito rappresentano la media calcolata sui risultati di 6 esecuzioni scartando la prima. Ecco i risultati ottenuti:

Ruby 1.9.0 : 21,123s
Ruby 1.8.6 : 94,736s
IronRuby : 26,123s
Python 2.5.1 : 33,827s
Python 3.0a1 : 48,718s
PHP 5.2.5 : 91,672s
PHP 5.3.0 : 77,813s
PHP 6.0.0 : 73,969s
Lua 5.1.2 : 14,912s

Ora un po’ di considerazioni:

  • Ruby 1.9 è dannatamente più veloce di Ruby 1.8.6. Punto.
  • IronRuby non è nemmeno uscito dallo stato di pre-alpha e già offre prestazioni molto buone, vicine a quelle di Ruby 1.9 che invece si sta avvicinando al rilascio. Ottimo!
  • Mi incuriosisce la differenza tra i tempi di Ruby 1.8.6 registrati da Antonio su OS X e quelli registrati da me su Windows: 159 secondi rispetto a 95 secondi mi sembra un abisso, soprattutto perché immagino che un Core 2 Duo 2.2 GHz sia più performante di un Athlon64 3700+ 2.2GHz.
  • Python 3.0 è più lento di Python 2.5.1, ma la versione 3.0a1 risale a fine Agosto per cui sarebbe il caso di ripetere lo stesso benchmark con una versione più aggiornata.
  • PHP sembra migliorare abbastanza con il passaggio da Zend Engine da 2.2.0 a 2.3.0, ma comunque le prende alla grande da Ruby 1.9 e Python.
  • Lua li straccia senza alcun ritegno.
  • Ordine di arrivo: Lua 5.1.2, Ruby 1.9.0, IronRuby 1.0 pre-alpha, Python 2.5.1, Python 3.0a1, PHP 6.0, PHP 5.3, PHP 5.2.5, Ruby 1.8.6.

Ovviamente un singolo microbenchmark di questo tipo non può essere assolutamente considerato come un valido indicatore delle prestazioni offerte da un linguaggio in situazioni reali, però i risultati sono comunque curiosi. A quanto pare i rubyisti avranno già un bel regalo assicurato per questo Natale :-)

PS: noto al termine della scrittura che Antonio ha scritto un altro articolo, aggiungendo Lisp e Haskell.