Ottimizzare il codice: un esempio pratico con bash e java (1/2)

27 02 2008

Questo articolo si riallaccia al post di qualche giorno fa sugli esempi di utilizzo del comando awk intitolato “qualche esempio di utilizzo di awk ed utili risorse web“.In quell’occasione vi avevo accennato al programmino java per convertire dei timestamp in date leggibili. Tutto questo perchè in questi giorni io ed il mio socio di tesi (pes) stiamo analizzando una serie di dati proveniente dagli archivi dei database di SourceForge (hihi abbiamo i super-privilegi di poter sguazzare liberamente negli enormi immensi oscuri database di SF🙂 )

In particolare dobbiamo elaborare delle statistiche durante un arco di tempo prefissato, ma i databases di SourceForge usano il timestamp in secondi per il tipo di dato date (ovvero la data). Quindi a noi serviva convertire il numero in un formato più comprensibile e facilmente gestibile anche con un foglio di calcolo (e badate bene che non ho detto excel😀 ). Mi serviva quindi un programmino semplice e veloce per fare questa conversione ed ho subito pensato di usare Java dato che sapevo già quali metodi usare senza bisogno di googlare o cercare nelle API.😉

La prima versione da me scritta consisteva in una semplice classe java che convertiva un solo timestamp alla volta (per esempio, il timestamp in secondi per la data di oggi vale circa 1204069465). Quindi era necessario uno script in bash + awk per iterare la funzione.

import java.util.Calendar;

public class DataConverter {

   public static void main(String[] args) {
      long timestamp;
      Calendar cal;
      int d, m, y;

      timestamp = Long.valueOf(args[0])*1000;
      cal = Calendar.getInstance();
      cal.setTimeInMillis(timestamp);

      m = cal.get(Calendar.MONTH)+1;
      d = cal.get(Calendar.DAY_OF_MONTH);
      y = cal.get(Calendar.YEAR);
      System.out.println(d + "/" + m + "/" + y);
   }
}
Il codice è autoesplicativo quindi non lo spiego (al massimo chiedete nei commenti), l’unica cosa che vi faccio notare è che ho moltiplicato il valore in ingresso per 1000 convertendolo così in millisecondi per sfruttare il metodo java già implementato.Poi per lanciarlo usavo lo stesso script di cui vi ho parlato nel post precedente e quindi non lo riporto per non allungare il post.
Il programma di per se è veloce se eseguito poche volte, ma guardate i tempi che si ottengono quando lo ho lanciato su un elenco di 11000 date (notate l’utilissimo comando time):

paso@casa:~/polimi/tesi/prove$ time ./convertiDate.sh | sh > dateOutput.txt
 
real 18m10.902s
user 9m37.256s
sys 2m49.275s
paso@casa:~/polimi/tesi/prove$

troppo lento! più di 18 minuti😯 su un P4 da 3.2ghz, mica su un commodore 16😀

È chiaro che si tratta di una programma fatto in fretta e furia e quindi per niente adatto su grandi numeri. Il collo di bottiglia è nella continua invocazione dell’intera classe java e non di solo una sua parte (tipo un sigolo metodo o un insieme ridotto di istruzioni), e quindi la continua riallocazione delle risorse (che vengono distrutte ogni volta che termina le istruzioni) necessarie per la sua esecuzione porta via i cicli di CPU poiché caricare i dati è decisamente più lento che eseguirli.

Nella prossima puntata vedremo come ottimizzare il codice utilizzando un solo linguaggio (Java) per fare tutto quello che ci serve.

PS: non so come mi sia venuto in mente di fare questo post così tecnico però mi piaceva e ci tenevo, magari può sempre servire a qualcuno, in fin dei conti i blog sono fatti per essere utili anche agli altri, altrimenti mi tenevo un diario segreto e personale nel mio comodino e buonanotte al secchio🙂


Azioni

Information

3 responses

27 02 2008
Libru » Ottimizzare il codice: un esempio pratico con bash e java (1/2)

[…] LeleV_200mph: Tutto questo perchè in questi giorni io ed il mio socio di tesi (pes) stiamo analizzando una serie di dati proveniente dagli archivi dei database di SourceForge (hihi abbiamo i super-privilegi di poter sguazzare liberamente negli enormi … […]

27 02 2008
paulpes

Già, ci è stato davvero molto utile, ma tu che sei un mago di java, non riesci a scrivere un programma che in automatico ci scrive anche la tesi dato l’indice come parametro?

28 02 2008
Paso

ci sto lavorando… però credo che il programma sarà finito quando noi avremo già finito la tesi…🙂

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...




%d blogger cliccano Mi Piace per questo: