Ottimizzazioni a volte sorprendenti

Nel post precedente riguardante newLISP ho inserito uno scriptino di una dozzina di righe per far vedere quando sia bello ed efficiente newLISP. Ebbene ho barato, solo un pochino (quello che da noi si direbbe na frisa o ‘n cicinin). Ma forse è il caso di raccontare tutta la storia, che ha una morale (laicista), quindi istruttiva.

La prima versione dello script usava (append-file)

syntax: (append-file str-filename str-buffer)
Works similarly to write-file, but the content in str-buffer is appended if the file in str-filename exists. If the file does not exist, it is created (in this case, append-file works identically to write-file). This function returns the number of bytes written.

Questo è lo script

;; versione lenta come raccontato nel post
(set 'k 1000)
(set 'm (* k k))
(set 'tstart (time-of-day))
(append-file "primes" (string 2 "\n"))
(dolist (n (sequence 3 (* 10 m) 2))
    (if (= (length (factor n)) 1)
        (append-file "primes" (string n "\n")))
)
(println (- (time-of-day) tstart))
(exit)

Sul mio ‘puter, con processore Intel Core Duo @ 2.4 GHz, 2 GB di RAM e Ubuntu 10.10 è tutto OK, l’esecuzione richiede circa 42-44 secondi (il dato che compare alla fine dell’esecuzione, viene da (time-of-day) che restituisce millisecondi)

A prima vista esaminando il grafico Cronologia CPU sembra che newLISP sia davvero fatto bene e riesca a utilizzare tutte le risorse disponibili: non è vero. La riga rossa è newlisp, quella arancione è nautilus. Ecco! (append-file) non richiede che il file sia aperto prima con (open) e chiuso alla fine con (close) ma ogni volta che viene chiamata è lei stessa che lo apre e chiude. Se c’è una sola CPU ci dev’essere uno swap continuo e le prestazioni decadono. Di molto.

Sul PC con Windows che uso di solito (XP su AMD Sempron @ 1.67 GHz, 448 MB di RAM) i tempi di esecuzione per la versione con (write-line) sono di 97-103 secondi, con (append-file) di 6440-6840 secondi (1h 38m e 1h 54m), cioè 86-87 volte peggiori!

CPU occupata con la versione (write-line)

 

CPU occupata con la versione (append-file)

 

distribuzione della CPU tra i processi durante l'esecuzione dello script

Ah! dimenticavo: con Windows dovete mettere in conto l’antivirus, che serve (eccome!) ma mangia.

L’esecuzione su un portatile con Vista su Acer Extensa Celeron 560 @ 2.13 MHz, 1 GB di RAM ha dato grafici simili (a proposito adesso Task Manager si chiama Gestione Attività Windows). La versione veloce ha richiesto 70-71 secondi, quella lenta l’ho interrotta.

versione (write-line)

 

versione (append-file)

Conclusione

Ed ecco la morale della storiella: mai fermarsi alla prima versione, se qualcosa non va come ci aspettiamo, prima di dare la colpa al programma, al computer o al mondo, verificare. E leggere tutto il manuale, fino in fondo, ma questo mi sembra di averlo già detto 😉

Posta un commento o usa questo indirizzo per il trackback.

Rispondi

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

Logo di WordPress.com

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

Google photo

Stai commentando usando il tuo account Google. 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 )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: