Uno dei miei progetti sulle simulazioni in performance computing si stava arenando. Prontamente uno dei miei manager mi consiglia di consultare uno dei nostri massimi esperti in materia, un guru di fama nazionale su algoritmi di calcolo applicati (in particolare sulle AI, i simulatori e gli scacchi). Sono sempre un po' scettico quando si va ad interpellare sti grandi vecchi dell'informatica ma avendo poco tempo, mi sono affidato a lui.
Il tizio effettivamente è un genio. Ha tirato fuori un algoritmo in C++ che incorniciarlo è poco. Un monumento al performance computing e alla scrittura di codice robusto e portabile. Insomma, anche io ho imparato un sacco di cose.
Problema: noi lo dovevamo mettere in un contesto multiutente e distribuito... Le applicazioni web in C++ hanno smesso di scriverle agli albori degli anni 90 per manifesta inefficienza rispetto agli interpreti ed ai modelli di gestione della memoria managed. Si entra quindi a parlare di VM e chiedo consigli su come effettuare il porting e quale linguaggio avrebbe potuto dare i risultati migliori (da un po' di giorni mi chiedevo cosa sarebbe successo a fare un port in Erlang). Vengo messo a tacere con sufficienza:
"Caro, si vede che sei giovane, ma dai retta a me che ho esperienza su queste cose: se devi correre ti serve una Ferrari, mica un giocattolino!"
Abbozzo. Se vi siete mai trovati in un contesto aziendale in cui c'è uno che viene considerato iperesperto dal capo dei capi per pregressi accademici (che poi ho scoperto essere del tutto analoghi ai miei, che ho oltre 20 anni di meno) e meriti conquistati sul campo, sapete come vanno queste cose. Risolini da gente che si scagazza addosso quando i clienti gli fanno domande tecniche e cose del genere, solo perché voi siete quello giovane e li fate sentire a disagio gran parte delle volte. Abbozzo un po' piccato, anche perché il tipo tutto sommato è un grande (e ho già deciso di chiedergli un po' di dritte per una AI per gli scacchi con cui lavoro da un paio di annetti per hobby).
Torno in ufficio nel pomeriggio e (quasi dando per scontato che il mio orgoglio sarebbe stato ulteriormente ferito) porto tutto prima in Java e poi in C#. Erlang me lo devo rivedere bene e ci vorrebbe troppo. So un po' rosic ma è pur vero che ormai ho un'esperienza decennale su certe cose e me un po' me le sento a sensazione. Mi occupo di 3D e performance computing su linguaggi managed da prima di Java 3D ed ho una discreta esperienza su cosa si fa meglio e cosa si fa peggio con cosa.
La prima versione mi fa guadagnare un +40% su Java, che diventa un +50% quando alle ottimizzazioni per l'esecuzione fatte per il C++ sostituisco quelle più tipiche per fare calcolo intensivo su VM Sun (poche righe di codice cambiate, giusto per venire incontro alle prerogative della VM).
Provo su .NET, il codice con poche modifiche non algoritmiche (francamente penso sia impossibile migliorarlo, è un'implementazione talmente perfetta da essere inattaccabile) guadagna un +70%, che mantiene anche su Ubuntu 9 con Linux.
I test fatti fianco a fianco rispetto al C++ sono stati realizzati con tutte le ottimizzazioni e gli inlining necessari, utilizzando la build più efficiente valutata con la media di 10 sessioni di profiling, che poi erano corrispondenti al 100% rispetto a quelle proposte dal luminare per quell'architettura (che volete, so malfidato!)
Evidentemente le Ferrari non sono più quelle di una volta

In realtà era semplicemente un contesto con cui le VM vanno a nozze: decine di milioni di calcoli in virgola mobile al secondo, con prospettive di parallelizzazione molto spinta (non ancora implementata) e un sacco di traffico in memoria. Insomma, ogni context switch produce un'inefficienza ed evitarli il più possibile aiuta.
Sono rimasto un po' male perché l'espertone in questione è veramente un genio di cui se ne vedono pochi in giro, ma a volte trolla come un forsennato (è arrivato a tirare fuori delle leggende metropolitane anti Java e anti Microsoft che nemmeno i talebani della FSF conoscono ed interpretano così bene).
Insomma, ho imparato un sacco di cose, oggi. La più importante è che mantenere una mente aperta quando progetti fa sempre molto comdo! Non siamo evangelisti!
