Sei sulla pagina 1di 11

DEV DEVeloping Software Solutions n.

154 ottobre 2007


Generazione di frattali
di Xavier Calbet
Un confronto delle prestazioni di PDL, IDL, MATLAB, Octave, C e FORTRAN77 nella generazio-
ne di frattali
Xavier Calbet
`
E un utente di software
free da molto tempo,
inizi ` o ad usare le distri-
buzioni Linux quando
la Slackware doveva
essere installata utiliz-
zando decine di oppy
disk...Attualmente la-
vora a due progetti:
un sistema di visualiz-
zazione di immagini
via satellite (SAPO) e
il linguaggio free per
calcoli numerici PDL
(Perl Data Language).
pubblicato su
WWW.INFOMEDIA.IT

stampa digitale da
Lulu Enterprises Inc.
stores.lulu.com/infomedia
Infomedia
Infomedia ` e limpresa editoriale che da quasi venti an-
ni ha raccolto la voce dei programmatori, dei sistemi-
sti, dei professionisti, degli studenti, dei ricercatori e dei
professori dinformatica italiani.
Sono pi ` u di 800 gli autori che hanno realizzato per le te-
state Computer Programming, Dev, Login, Visual Basic
Journal e Java Journal, molte migliaia di articoli tecnici,
presentazioni di prodotti, tecnologie, protocolli, strumen-
ti di lavoro, tecniche di sviluppo e semplici trucchi e stra-
tagemmi. Oltre 6 milioni di copie distribuite, trentamila
pagine stampate, fanno di questa impresa la pi` u grande ed
inuente realt` a delleditoria specializzata nel campo della
programmazione e della sistemistica.
In tutti questi anni le riviste Infomedia hanno vissuto del-
la passione di quanti vedono nella programmazione non
solo la propria professione ma unattivit` a vitale e un vero
divertimento.
Nel 2009, Infomedia ` e cambiata radicalmente adottando
un nuovo modello aziendale ed editoriale e si ` e organiz-
zata attorno ad una idea di Impresa Sociale di Comunit` a,
partecipata da programmatori e sistemisti, separando le
attivit` a di gestione dellinformazione gestite da un board
comunitario professionale e quelle di produzione gesti-
te da una impresa strumentale. Questo assetto ` e in linea
con le migliori esperienze internazionali e rende Infome-
dia ancora di pi ` u parte della Comunit` a nazionale degli
sviluppatori di software.
Infomedia ` e media-partner di manifestazioni ed eventi in
ambito informatico, collabora con molti dei pi` u impor-
tanti editori informatici italiani come partner editoriale e
fornitore di servizi di localizzazione in italiano di testi in
lingua inglese.
Limpaginazione automatica di questa rivista ` e realizzata al
100% con strumenti Open Source usando OpenOffice,
Emacs, BHL, LaTeX, Gimp, Inkscape e i linguaggi Lisp,
Python e BASH
For copyright information about the contents of DEV,
please see the section Copyright at the end of each ar-
ticle if exists, otherwise ask authors. Infomedia contents
is 2007 Infomedia and released as Creative Commons
2.5 BY-NC-ND. Turing Club content is 2007 Turing
Club released as Creative Commons 2.5 BY-ND.
Le informazioni di copyright sul contenuto di DEV so-
no riportate nella sezione Copyright alla ne di cia-
scun articolo o vanno richieste direttamente agli autori.
Il contenuto Infomedia ` e 2007 Infomedia e rilasciato
con Licenza Creative Commons 2.5 BY-NC-ND. Il con-
tenuto Turing Club ` e 2007 Turing Club e rilasciato
con Licenza Creative Commons 2.5 BY-ND. Si applicano
tutte le norme di tutela dei marchi e dei segni distintivi.
`
E in ogni caso ammessa la riproduzione parziale o tota-
le dei testi e delle immagini per scopo didattico purch e
vengano integralmente citati gli autori e la completa
identicazione della testata.
Manoscritti e foto originali, anche se non pubblicati, non
si restituiscono.
Contenuto pubblicitario inferiore al 45%.
La biograa dellautore riportata nellarticolo e sul
sito www.infomedia.it ` e di norma quella disponibi-
le nella stampa dellarticolo o aggiornata a cu-
ra dellautore stesso. Per aggiornarla scrivere a
info@infomedia.it o farlo in autonomia allindirizzo
http://mags.programmers.net/moduli/biograa
16
>>
5pecla|e
DEv > n.154 oLLobre 2007
&DOFROR1XPHULFR
17
<<
DEv > n.154 oLLobre 2007
&DOFROR1XPHULFR
S
e siete uno scienziato di proessione, un ap-
passionato, un ingegnere o un natenatico,
e avete necessit di eettuare rapidanente e
acilnente calcoli e graici nunerici, allora
PDL (Perl Data Language) certanente
uno dei nigliori strunenti sotvare ree da
utilizzare. PDL ha tutto ci che hanno analoghi linguaggi
proprietari ad alto livello per il calcolo nunerico (cone IDL
o MATLAB). E certanente dotato di tutte le unzionalit
che vi aspettereste da un pacchetto di calcolo nunerico.
,QWURGX]LRQH
In questo articolo, esplorer una divertente applicazione
del canpo del calcolo nunerico: il rattale di Mandelbrot.
Per generare rattali necessario eseguire diversi calcoli e
poi plottare i risultati. Cli esenpi che seguono sono anche
abbastanza senplici da seguire, na hanno caratteristiche
suicienti per ricavare un'inpressione sul linguaggio uti-
lizzato. Per questo particolare conpito, i linguaggi ad alto
livello per il calcolo nunerico rappresentano lo strunento
ideale. Questi linguaggi orniscono un rapido ciclo di svi-
luppo a causa della propria natura di essere ad alto livello.
E anche acile generare graici di qualit con questi tool.
Cone si vedr in seguito, la penalit che si paga in ternini
di prestazioni in velocit utilizzando questi linguaggi
relativanente piccola.
L'esenpio di rattale di Mandelbrot esaninato in questo
articolo verr sviluppato sia con linguaggi proprietari sia
ree: PDL, IDL, MATLAB e Cctave. Ci ci pernetter di
conrontarli qualitativanente in una tabella che evidenzia i
pro e i contro di ciascun linguaggio. Inoltre, verr eseguito
un conronto quantitativo delle prestanzini per illustrare
la velocit di ciascuno dei linguaggi. Ai ini del conronto,
verr anche nostrato il codice C e ICRTRAI di questi
esenpi.
,OIUDWWDOHGL0DQGHOEURW
Secondo la deinizione di Wikipedia, un rattale una orna
geonetrica articolata o rannentata che pu essere suddi-
visa in parti, ciascuna delle quali (alneno approssinativa-
nente) una copia di dinensione ridotta dell'intera orna.
L'insiene di Mandelbrot uno dei rattali pi popolari. In
questo articolo colorer i rattali in un nodo leggernente
dierente e artistico (cone si nota nella )LJXUD). Il rat-
tale di Mandelbrot viene generato iterando una relazione
natenatica tra nuneri conplessi (si veda ]1| per una rapida
introduzione ai nuneri conplessi). Partendo da un valore
zero di una variabile conplessa ], il rattale si naterializza
iterando la seguente assegnazione:
z = z * z + k
dove N un nunero conplesso che viene nantenuto costante
per tutte le iterazioni. Il valore inale di ]dipende nolto
dal valore del nunero conplesso N. Per alcuni valori di N,
il valore inale di ]converge a un certo valore inito e per
alcuni altri, ]diverge verso l'ininito. Per evitare probleni
nunerici con le divergenze nei calcoli introdurreno una
trucco di progrannazione che consiste nel vincolare i valori
di ] tra -5 e 5 dopo ciascuna iterazione. Iell'innagine
rattale inale, l'asse [rappresenter i valori reali di Ne l'asse
\i valori innaginari. Iel rattale di Mandelbrot, di norna
ai valori divergenti di ]viene attribuito un colore e a quelli
convergenti un altro. La rontiera tra un colore e l'altro un
rattale. Qui colorer le innagini utilizzando una palette
ad arcobaleno per rappresentare i valori della ornula:
image = log (sqrt(Re(z) * Re(z) + Im(z) * Im(z)) + 1)
dove 5He ,Pdenotano rispettivanente la parte reale e in-
naginaria di ]. L'innagine inale del rattale di Madelbrot
pu essere vista nella )LJXUD.
3'/
PDL un'estensione del linguaggio Perl per l'elborazione
nunerica e la graica scientiica. Essendo derivato dal Perl
ha la sintassi lineare di un linguaggio di progrannazione
ben deinito. Si pu anche ar uso di uno dei tanti pacchetti
di noduli disponibili nell'archivio Perl (CPAI), al ine
di inpiegare il linguaggio per altri scopi cone l'accesso a
database, la gestione delle date, la conunicazione inter-
Un ccnfrcntc de||e prestazcn d PDL, DL, MA7LAB, Octave, C e FOP7PAN77 ne||a
generazcne d fratta|.
Cenerazione di IUDWWDOL
16
>>
5pecla|e
DEv > n.154 oLLobre 2007
&DOFROR1XPHULFR
17
<<
DEv > n.154 oLLobre 2007
&DOFROR1XPHULFR
processo, toolkit CLI, solo
per citarne alcuni.
,QVWDOODUH3'/
Sortunatanente, PDL non
viene installato per deault su
nolte delle pi diuse distri-
buzioni CIL/Linux. Ancor
peggio, alcune distribuzioni
sono prive dei pacchetti rela-
tivi a PDL o sono in parte cor-
rotti. Se si sta utilizzando una
distribuzione CIL/Linux
basata su Debian (Lbuntu,
Knoppix, ecc.) e si ha accesso
agli usuali repositor, Debian,
abbastanza acile installare
PDL. Per poter seguire gli
esenpi di questo artioclo si
dovranno installare i pac-
chetti SGO, SJSORWe SJSHUO. Ci
pu essere atto (cone utente
root) attraverso il consueto
conando:

apt-get install pdl pgplot5 pgperl
Se nel vostro caso ci non osse
possibile, seguite le istruzioni
riportate in ]2|.
/D ULJD GL FRPDQGR GL
3'/
Dopo aver installato PDL si sar in grado di eseguirlo
da riga di conando. Perci basta digitare da una inestra
terninale
perldl
Cos acendo, otterrete un nessaggio iniziale del tipo:
xcalbet@debian:~$ perldl
perlDL shell v1.33
PDL comes with ABSOLUTELY NO WARRANTY. For details, see the hle `COPYING in
the PDL distribution. This is free software and you are welcome to redistribute
it under certain conditions, see the same hle for details.
ReadLines, NiceSlice, MultiLines enabled
Reading PDL/default.perldlrc...
Found docs database /usr/local/lib/perl/5.8.4/PDL/pdldoc.db
Type `help for online help
Type `demo for online demos
Loaded PDL v2.4.2
perldl>
A questo punto, si possono provare alcune delle caratteri-
stiche di PDL digitando dal pronpt di PDL:

perldl> demo
Ci ar apparire un elenco di deno da poter provare.
E' necessario anche veriicare che la libreria graica che
utilizzate da PDL stia unzionando opportunanente. Per
are ci digitare:

perldl> demo pgplot
Sullo scherno dovrebbero apparire alcuni graici. Se cos
non osse, consultate ]2|.
Iel prossino paragrao, spiegher passo per passo cone
generare il rattale di Mandelbrot dalla riga di conando di
PDL, pertanto si potranno apprendere i concetti essenziali
di PDL.
,OIUDWWDOHGL0DQGHOEURWFRQ3'/
In Perl i valori scalari di solito vengono denotati da un none
di variabile preceduto da un sinbolo dollaro ($"). Queste
variabili possono contenere un solo oggetto che pu essere
una stringa, un oggetto pi conplesso, oppure, cone in
questo caso particolare, un valore nunerico:
l| fraLLa|e dl Mande|broL ),*85$
1S
>>
5pecla|e
DEv > n.154 oLLobre 2007
&DOFROR1XPHULFR
19
<<
DEv > n.154 oLLobre 2007
&DOFROR1XPHULFR
perldl> $npts=200;
perldl> $niter=10;
Il nunero di punti lungo il
lato del quadrato dell'inna-
gine rattale e il nunero di
iterazioni del calcolo di Man-
delbrot vengono nenoriz-
zati nelle rispettive variabili.
Possiano dare un'occhiata al
contenuto di queste variabili
con la unzione SULQW:
perldl> print $npts;
200
Cli elenenti ondanentali
del linguaggio PDL sono
arra, a n dinensioni di so-
lito detti SLGGOH". Ln SLGGOH
viene nenorizzato in una
variabile scalare Perl, cone
parte reale e innaginaria di
], ossia ]5He ],P:
perldl> $zRe=zeroes(double,$npts,$
npts);
perldl> $zIm=zeroes(double,$npts,$
npts);
In questo caso, con la unzio-
ne ]HURHV vengono generati
arra, quadrati a valore zero
in due dinensioni e a doppia
precisione. La dinensione
dell'arra, deterninata dalla variabile $npts.
Si possono ora creare le natrici che rappresenteranno la
costante k utilizzando le unzioni [OLQYDOV e \OLQYDOV. Que-
ste unzioni assegnano rispettivanente valori dierenti per
ciascuna colonna o riga in un certo intervallo.
perldl> $kRe=$zRe->xlinvals(-1.5,0.5);
perldl> $kIm=$zIm->ylinvals(-1,1);
Possiano sezionare le natrici N5He N,Pcon il netodo
VOLFHper avere un'idea nigliore di ci che anno le unzioni
[OLQYDOV e \OLQYDOV (/LVWDWR).
Si pu ora ar partire un ciclo per eettuare QLWHUiterazioni
dei calcoli nunerici. La sintassi dei cicli in Perl nolto
sinile a quella del linguaggio C:
perldl> for($j=0;$j<$niter;$j++){
Il pronpt di PDL si nodiicher in:
..{ >
cio si aspetta che introduciate ad un certo punto la ine
del ciclo.
Le operazioni natenatiche tra i SLGGOH di solito vengono ese-
guite elenento per elenento. Ci accade quando entranbi
Zoom ne| fraLLa|e dl Mande|broL ),*85$

.
/,67$72
perldl> print $kRe->slice(`0:4,0:4);
[
[ -1.5 -1.497998 -1.495996 -1.493994 -1.491992]
[ -1.5 -1.497998 -1.495996 -1.493994 -1.491992]
[ -1.5 -1.497998 -1.495996 -1.493994 -1.491992]
[ -1.5 -1.497998 -1.495996 -1.493994 -1.491992]
[ -1.5 -1.497998 -1.495996 -1.493994 -1.491992]
]
perldl> print $kIm->slice(`0:4,0:4);
[
[ -1 -1 -1 -1 -1]
[ -0.997998 -0.997998 -0.997998 -0.997998 -0.997998]
[ -0.995996 -0.995996 -0.995996 -0.995996 -0.995996]
[-0.99399399 -0.99399399 -0.99399399 -0.99399399 -0.99399399]
[-0.99199199 -0.99199199 -0.99199199 -0.99199199 -0.99199199]
]
1S
>>
5pecla|e
DEv > n.154 oLLobre 2007
&DOFROR1XPHULFR
19
<<
DEv > n.154 oLLobre 2007
&DOFROR1XPHULFR
i SLGGOH hanno esattanente le stesse dinensioni. Pertanto, se
si noltiplicano o si aggiungono diversi piddle della stessa
dinensione, queste operazioni verranno eseguite elenento
per elenento e il risultato inale verr assegnato a una natrice
della stessa dinensione di quella originale. Si pu sruttare
questa propriet per eettuare le iterazioni richieste per
l'insiene di Mandelbrot (z ~ z ^ z + k) il quale, se suddiviso
nelle parti reale e innaginaria, appare cone:
..{ > $qRe=$zRe*$zRe-$zIm*$zIm+$kRe;
..{ > $qIm=2*$zRe*$zIm+$kIm;
Si dovr poi applicare la tecnica di linitare i valori tra -5 e 5
dopo ciascuna iterazione; ci in PDL viene atto utilizzando
la unzione FOLS:

.
/,67$72
#!/usr/bin/env perl
# PDL code to generate a Mandelbrot fractal
use PDL;
use PDL::Graphics::PGPLOT::Window;
use PDL::Graphics::LUT;
# Number of points in side of image and
# number of iterations in the Mandelbrot
# fractal calculation
$npts=1000;
$niter=51;
# Generating z = 0 (real and
# imaginary part)
$zRe=zeroes(double,$npts,$npts);
$zIm=zeroes(double,$npts,$npts);
# Generating the constant k (real and
# imaginary part)
$kRe=$zRe->xlinvals(-1.5,0.5);
$kIm=$zIm->ylinvals(-1,1);
# Iterating
print "Calculating Mandel\n;
for($j=0;$j<$niter;$j++){
# Calculating q = z*z + k in complex space
# q is a temporary variable to store the result
$qRe=$zRe*$zRe-$zIm*$zIm+$kRe;
$qIm=2*$zRe*$zIm+$kIm;
# Assigning the q values to z constraining between
# -5 and 5 to avoid numerical divergences
$zRe=$qRe->clip(-5,5);
$zIm=$qIm->clip(-5,5);
}
# Lines below this one are commented out when making
# the benchmark.
# Generating plot
print "Generating plot\n;
# Opening a window for plotting
$w=PDL::Graphics::PGPLOT::Window->new(Device=>/xserve);
# Changing the color palette
$w->ctab( lut_data(`rainbow2) );
# Generating the image to plot
$image=log( sqrt($zRe**2+$zIm**2) + 1);
# Plotting the image
$w->imag($image);

.
/,67$72
pro mandel
; IDL code to generate a Mandelbrot fractal
; Number of points in side of image and
; number of iterations in the Mandelbrot
; fractal calculation
npts=1000
niter=51
; Generating z = 0 (real and
; imaginary part)
zRe=dblarr(npts,npts)
zIm=dblarr(npts,npts)
; Generating the constant k (real and
; imaginary part)
a=dindgen(npts,npts)
kRe=a mod npts
kIm=foat(foor(a/npts))
kRe=kRe*2.0/(npts-1.)-1.5
kIm=kIm*2.0/(npts-1.)-1
; Iterating
print,Calculating Mandel
for j=1,niter do begin
; Calculating q = z*z + k in complex space
; q is a temporary variable to store the result
qRe=zRe*zRe-zIm*zIm+kRe
qIm=2*zRe*zIm+kIm
; Assigning the q values to z constraining between
; -5 and 5 to avoid numerical divergences
zRe = qRe < 5
zRe = zRe > (-5.)
zIm = qIm < 5
zIm = zIm > (-5.)
end
; Lines below this one are commented out when making
; the benchmark.
; Generating plot
print,Generating plot
; Opening a window for plotting
device,decomposed=0,retain=2
Window,0,Xsize=400,Ysize=400
; Generating the image to plot
image=alog( sqrt(Re^2+Im^2) + 1)
; Plotting the image
tvscl,image
end
20
>>
DEv > n.154 oLLobre 2007
5pecla|e
&DOFROR1XPHULFR
21
<<
DEv > n.154 oLLobre 2007
&DOFROR1XPHULFR
..{ > $zRe=$qRe->clip(-5,5);
..{ > $zIm=$qIm->clip(-5,5);
e ora inseriano la ine del ciclo:
..{ > }
I calcoli richiederanno alcuni secondi su un PC relativa-
nente noderno. Al ternine della conputazione riapparir
il pronpt di PDL.
Perl un linguaggio nodulare con la possibilit, se necessa-
rio, di caricare altri noduli. Per rappresentare graicanente
il rattale sar necessario caricare due noduli utilizzando
lo statenent XVH:
perldl> use PDL::Graphics::PGPLOT::Window;
perldl> use PDL::Graphics::LUT;
A questo punto si pu aprire una inestra per la rappresen-
tazione graica:
perldl> $w=PDL::Graphics::PGPLOT::Window->new(Device=>/xserve);
Se tutto unziona perettanente, dovr apparire una inestra
vuota sullo scherno. Si pu ora selezionare una palette di
colori e calcolare l'innagine inale:
perldl> $w->ctab( lut_data(`rainbow2) );
perldl> $image=log( sqrt($zRe**2+$zIm**2) + 1);
Siano ora pronti a disegnare il graico del rattale di Man-
delbrot:
perldl> $w->imag($image);
Apparir un'innagine sinile a quella di )LJXUD. Cone si
visto, eseguire calcoli nunerici in PDL acile e banale. E
anche disegnare graici dei propri dati nolto acile.
Le istruzioni PDL appena viste, possono essere riunite in
un progranna Perl denoninato PDQGHOSO, nostrato nel
/LVWDWR.
,QJUDQGLPHQWLGHOIUDWWDOHGL0DQGHOEURW
A questo punto nolto acile eseguire un'operazione di
zoon nel rattale di Mandelbrot, agendo sui valori iniziali
di N. Si pu ottenere ci nodiicando l'assegnazione ini-
ziale di Nin:
# Genera la costante k
$kRe=$zRe->xlinvals(0.34,0.44);
$kIm=$zIm->ylinvals(0.29,0.39);
Il risultato nostrato nella )LJXUD.
3HFXOLDULWjGL3'/
Ci sarebbe nolto altro da dire su PDL oltre a ci che si
appena visto. Lna delle caratteristiche che lo rendono
potente e lo distingue da altri linguaggi il conportanen-
to degli operatori natenatici quando le natrici coinvolte
non hanno le stesse dinensioni. Queste propriet sono
abbastanza ben descritte nella pagina di docunentazione
]3| e non verranno discusse qui.
Ln'ulteriore caratteristica inportante sono le nolte unzio-
ni disponibili per la nanipolazione delle dinensioni e del
contenuto degli arra,. Ie abbiano viste alcune cone ]HURHV
e [OLQYDOV, na ne sono disponibili nolte altre che rendono

.
/,67$72
% MATLAB and Octave code to generate a Mandelbrot fractal
% Number of points in side of image and
% number of iterations in the Mandelbrot
% fractal calculation
npts=1000;
niter=51;
% Generating z = 0 (real and
% imaginary part)
zRe=zeros(npts,npts);
zIm=zeros(npts,npts);
% Generating the constant k (real and
% imaginary part)
kRe=repmat(linspace(-1.5,0.5,npts),npts,1);
kIm=repmat(linspace(-1,1,npts),1,npts);
% Iterating
for j=1:niter
% Calculating q = z*z + k in complex space
% q is a temporary variable to store the result
qRe=zRe.*zRe-zIm.*zIm+kRe;
qIm=2.*zRe.*zIm+kIm;
% Assigning the q values to z constraining between
% -5 and 5 to avoid numerical divergences
zRe=qRe;
qgthve= hnd(qRe > 5.);
zRe(qgthve)=5.;
qltmhve=hnd(qRe<-5.);
zRe(qltmhve)=-5.;
zIm=qIm;
hgthve=hnd(qIm>5.);
zIm(hgthve)=5.;
hltmhve=hnd(qIm<-5.);
zIm(hltmhve)=-5.;
end
% Lines below this one are commented out when making
% the benchmark.
% Generating plot
% Generating the image to plot
ima=log( sqrt(zRe.*zRe+zIm.*zIm) + 1);
% Plotting the image
imagesc(ima);
exit
20
>>
DEv > n.154 oLLobre 2007
5pecla|e
&DOFROR1XPHULFR
21
<<
DEv > n.154 oLLobre 2007
&DOFROR1XPHULFR
la progrannazione degli arra, nolto pi acile che in altri
linguaggi equivalenti.
Sono conunque disponibili delle eccellenti introduzioni a
PDL, alcune delle quali sono riportate nella bibliograia.
Ma ora tenpo di entrare nella conpetizione!
,'/
IDL un linguaggio proprietario, certanente non ree,
orientato all'elaborazione nunerica, ed nolto sinile a PDL.
Cli operatori natenatici vengono utilizzati principalnente
elenento per elenento cone in PDL. Bench, naturalnen-
te, esistano altri tipi di operazioni, cone la noltiplicazione
di natrici. La versione IDL del progranna Mandelbrot
nostrata nel /LVWDWR. I connenti nel codice orono una
spiegazione delle operazioni eseguite.
0$7/$%
MATLAB un linguaggio proprietario rivolto princi-
palnente ai calcoli natenatici. E ben adatto per natrici
bidinensionali na pu anche lavorare in nodo eiciente
con natrici di dinensioni superiori. Ed anche, cone si
vedr dai test, un linguaggio relativanente lento in ternini
di velocit di esecuzione. Lno dei vantaggi che dispo-
nibile un enorne nunero di unzioni natenatiche acile
da utilizzare, dalla risoluzione delle equazioni dierenziali
ordinarie, ai probleni di nininizzazione, ecc. Iel /LVWDWR
si pu vedere il progranna Mandelbrot in MATLAB con
i relativi connenti che spiegano il codice.
2FWDYH
Cctave un sotvare ree clone di MATLAB. Inatti, il
principale vantaggio che ne un clone quasi peretto. Il
codice scritto per MATLAB verr eseguito nolto probabil-
nente con pochissini intoppi in Cctave. Inatti, l'esenpio
Cctave del progranna Mandelbrot esattanente lo stesso
di MATLAB, nostrato nel /LVWDWR. Essendone un clone
ne condivide tutti i vantaggi e gli svantaggi, conpresa la
lentezza. La sola eccezione nel prezzo.
&H)2575$1
C e ICRTRAI77 sono linguaggi a basso livello, che non
si conrontano bene in ternini di tenpo di sviluppo con
lesL sul Lempl dl esecuzlone de| ca|co|o de| fraLLa|e dl Mande|broL. ),*85$
22
>>
DEv > n.154 oLLobre 2007
5pecla|e
Ca!co!o uncrico
23
<<
DEv > n.154 oLLobre 2007
&DOFROR1XPHULFR
gli altri linguaggi di calcolo e graici nunerici, na sono
certanente nolto veloci in ternini di tenpo di esecuzione.
Sono stati conpresi qui per il conronto dei test giusto per
dare un'idea di quanto siano pi lenti i linguaggi ad alto
livello in conronto a questi tradizionali linguaggi a basso
livello. Il Listato 5 nostra il progranna Mandelbrot in C,
nentre il Listato 6 la versione in ICRTRAI.
7DEHOODGLFRQIURQWRTXDOLWDWLYR
La !abc!!a 1 riassune gli aspetti qualitativi nenzionati nei
precedenti paragrai. Le colonne della tabella sono:
x Linguaggio: il none del linguaggio.
x Vcrsionc: la versione del linguaggio utilizzata nei
test.
x F!ag: lag di conpilazione o svitch della riga di conando
utilizzati nei test.
x A!to !ivc!!o: indica se il linguaggio ad alto livello,
orientato agli arra,, se un linguaggio per il calcolo
nunerico o neno.
x Sintassi: la consistenza della sintassi degli statenent del
linguaggio e la disponibilit di unzioni di nanipolazione
degli arra, per evitare cicli sugli indici degli arra,.
x Funzioni natcnatichc c di I/C: disponibilit di un-
zioni natenatiche e di unzioni di lettura di ornati
scientiici di ile.
x Prczzo: sotvare ree o neno.
7HVW
I test sono qualcosa di conplicato. Ci vero specialnen-
te nel caso dei linguaggi orientati alle natrici cone quelli
nostrati qui.
Cicli espliciti sugli indici delle natrici o istruzioni LI an-
drebbero evitati, poich queste istruzioni talvolta possono
rendere il codice nolto pi lento.
Cran parte delle unzioni di questi linguaggi sono nolto
ad alto livello ed eseguono diversi conpiti pi o neno
conplessi. La scelta di alcune unzioni rispetto ad altre che

.
/,67$72
#include <stdio.h>
#include <math.h>
// Number of points in side of image
#dehne NPTS 1000
int main(void) {
double zRe[NPTS][NPTS];
double zIm[NPTS][NPTS];
double kRe[NPTS][NPTS];
double kIm[NPTS][NPTS];
double qRe[NPTS][NPTS];
double qIm[NPTS][NPTS];
long int i,j,k,niter;
// Number of iterations in the Mandelbrot
// fractal calculation
niter=51;
for (i=0;i<NPTS;i++) {
for (j=0;j<NPTS;j++) {
// Generating z = 0 (real and
// imaginary part)
zRe[i][j]=0.;
zIm[i][j]=0.;
// Generating the constant k (real and
// imaginary part)
kRe[i][j]=(double)i*2.0/((double)NPTS-1.)-1.5;
kIm[i][j]=(double)j*2.0/((double)NPTS-1.)-1.;
}
}
// Iterating
//printf("Calculating Mandel\n);
for(k=0;k<niter;k++){
for (i=0;i<NPTS;i++) {
for (j=0;j<NPTS;j++) {
// Calculating q = z*z + k in complex space
// q is a temporary variable to store the result
qRe[i][j]=zRe[i][j]*zRe[i][j]-zIm[i][j]*zIm[i][j]+kRe[i][j];
qIm[i][j]=2.*zRe[i][j]*zIm[i][j]+kIm[i][j];
// Assigning the q values to z constraining between
// -5 and 5 to avoid numerical divergences
zRe[i][j]=qRe[i][j];
zIm[i][j]=qIm[i][j];
if (zRe[i][j] < -5.) zRe[i][j]=-5.;
if (zRe[i][j] > 5.) zRe[i][j]=5.;
if (zIm[i][j] < -5.) zIm[i][j]=-5.;
if (zIm[i][j] > 5.) zIm[i][j]=5.;

}
}
}
// Lines below this one are commented out when making
// the benchmark.
// Writing image to STDOUT
for (i=0;i<NPTS;i++) {
for (j=0;j<NPTS;j++) {
printf("%f ",log( sqrt(zRe[i][j]*zRe[i][j]+zIm[i][j]*zIm[i][j]) +
1.));
}
printf("\n);
}
}
22
>>
DEv > n.154 oLLobre 2007
5pecla|e
&DOFROR1XPHULFR
23
<<
DEv > n.154 oLLobre 2007
&DOFROR1XPHULFR
orniscono conplessivanente lo stesso risultato nunerico
pu avere un inpatto relativanente alto nei test. Ln chiaro
esenpio l'inplenentazione dell'equivalente della unzione
FOLSdi PDL in MATLAB e Cctave. In base all'inplenenta-
zione adottata, un linguaggio stato pi veloce dell'altro. In
questo articolo stata adottata la soluzione che senbra pi
naturale ai progrannatori MATLAB, na questa tecnica,
cone si vede nella )LJXUD, d un certo vantaggio a MA-
TLAB. Mentre l'altra soluzione, non nostrata qui, ha dato
un leggero vantaggio ad Cctave. Ln ulteriore esenpio
l'ordine dei cicli nei linguaggi C e ICRTRAI. Invertendo
l'ordine dei cicli degli indici della natrice (i e j) si ottenuto
una signiicativa penalit in ternini di prestazioni.
In ogni caso, questo test pu servire allo scopo di ornire un
ordine di grandezza delle velocit di esecuzione di ciascuno
dei linguaggi, rivelando se sono paragonabili o neno.
Il sistena utilizzato per i test un PC con processore Intel
Pentiun 4 a 2.8CHz, con una cache di 1024 KB e 512 MB
di RAM. Il sistena operativo SuSE Linux 9.3 (i586) con
versione del kernel 2.6.11.4-21.15-2np.
In questo benchnark, ho eseguito esattanente il codice
nostrato nei listati di questo articolo, traendo conto dei
seguente connenti:
1. Trattandosi di linguaggi per l'elaborazione nunerica
senbra ragionevole testarli con grossi arra,. Per ottenere
una nigliore accuratezza nei test abbiano iterato pi
volte l'algoritno di Mandelbrot. Perci i test sono stati
eseguiti con QSWV~2000 e QLWHU~1000. Ci signiica
eettivanente che i test vengono eseguiti su arra, di
dinensione 2000 x 2000 e per 1000 iterazioni.
2. Le routine di plottaggio non sono state coinvolte nei
test, si tenuto conto solo della parte di elaborazione
nunerica. Cone evidenziato nei connenti dei listati,
le ultine righe di codice che disegnano il graico nei
test sono state connentate.
3. Per nisurare il tenpo di esecuzione stato utilizzato il
conando WLPH. Il risultato inale nostrato nella )LJXUD
la sonna del tenpo di sistena pi il tenpo del pro-
cesso utente. Per rendere sinili i conronti, nel caso dei
linguaggi C e ICRTRAI, al tenpo inale dei test sono
stati anche aggiunti i tenpi di conpilazione del codice.

.
/,67$72
program mandel
! FORTRAN77 code to generate a Mandelbrot fractal
implicit none
integer npts
! Number of points in side of image
parameter (npts=1000)
real*8 zRe(npts,npts)
real*8 zIm(npts,npts)
real*8 kRe(npts,npts)
real*8 kIm(npts,npts)
real*8 qRe(npts,npts)
real*8 qIm(npts,npts)
integer i,j,k,niter
! Number of iterations in the Mandelbrot
! fractal calculation
niter=51

do j=1,npts
do i=1,npts
! Generating z = 0 (real and
! imaginary part)
zRe(i,j)=0.
zIm(i,j)=0.
! Generating the constant k (real and
! imaginary part)
kRe(i,j)=dble(i)*2.0/(dble(npts)-1.)-1.5
kIm(i,j)=dble(j)*2.0/(dble(npts)-1.)-1.
enddo
enddo
! Iterating
! print *,Calculating Mandel
do k=1,niter
do j=1,npts
do i=1,npts
! Calculating q = z*z + k in complex space
! q is a temporary variable to store the result
qRe(i,j)=zRe(i,j)*zRe(i,j)-zIm(i,j)*zIm(i,j)+kRe(i,j);
qIm(i,j)=2.*zRe(i,j)*zIm(i,j)+kIm(i,j);
! Assigning the q values to z constraining between
! -5 and 5 to avoid numerical divergences
zRe(i,j)=qRe(i,j);
zIm(i,j)=qIm(i,j);
if (zRe(i,j) < -5.) zRe(i,j)=-5.;
if (zRe(i,j) > 5.) zRe(i,j)=5.;
if (zIm(i,j) < -5.) zIm(i,j)=-5.;
if (zIm(i,j) > 5.) zIm(i,j)=5.;
enddo
enddo
enddo
! Lines below this one are commented out when making
! the benchmark.
! Writing image to STDOUT
do i=1,npts
do j=1,npts
print *,log( sqrt(zRe(i,j)*zRe(i,j)+zIm(i,j)*zIm(i,j)) + 1.)
enddo
enddo

end program mandel
24
>>
DEv > n.154 oLLobre 2007
5pecla|e
&DOFROR1XPHULFR
;DYLHU&DOEHW
an a/n/ J| sa//u:r /r J: ma|/a /mpa, |n|:| :J as:r |
J|s/r||a:|an| L|nax a:nJa |: S|::|u:r Jarr: ssr |ns/:||:/:
a/|||:::nJa J:|n J| /|app J|s|... A//a:|mn/ |:rar: : Ja pra//|.
an s|s/m: J| r|sa:||::::|an J| |mm:|n| r|: s:/|||/ (SAPO) ||
||na:|a /r pr ::|:a|| namr|:| PDL (Pr| D:/: L:na:).
In ogni caso, a causa del notevole tenpo trascorso ad
eseguire le 1000 iterazioni, questi tenpi di conpilazione
o di avvio dei linguaggi testati realnente trascurabile
in conronto al tenpo totale.
4. La particolare versione dei linguaggi e dei lag di con-
pilazione nostrata nella 7DEHOOD.
&RQFOXVLRQL
I linguaggi natriciali ad alto livello, rappresentano uno
strunento utile per sviluppare progetti con pesanti calcoli
nunerici o che richiedono graici di dati scientiici. Con
questi tool relativanente acile ottenere veloci cicli di
sviluppo. Questa caratteristica stata illustrata dalla gene-
razione del rattale di Mandelbrot.
Il conronto qualitativo tra diversi di questi tipi di linguaggi
(PDL, IDL, MATLAB e Cctave) pu essere visto neglio
nella 7DEHOOD . Inutile dire che un siatto conronto
nolto soggettivo.
I test sugli esenpi qui orniti (si veda la )LJXUD) nostrano
che alcuni linguaggi ad alto livello orientati agli arra,, cone
IDL o PDL, se opportunanente codiicati per evitare cicli su-
gli indici degli arra, e istruzioni |/, sono solo circa tre-quattro
volte pi lenti dei pi veloci linguaggi a basso livello cone
C o ICRTRAI77. MATLAB e Cctave hanno prestazioni
sinili e sono chiaranente pi lenti di IDL o PDL.
Dal nio personale punto di vista, PDL vince alla grande.
Iornisce pressoch le stesse unzionalit o addirittura un-
zionalit nigliori rispetto ad altre soluzioni proprietarie
pi costose. In particolare, le unzioni natenatiche e di
I/C ornite da PDL sono pressoch equivalenti a quelle
delle soluzioni proprietarie e, nel caso della nanipolazione
di arra, e della sintassi del linguaggio, PDL il nigliore.
Se si considera il prezzo, il conronto non si pone: a titolo
gratuito vs. oneroso. Con PDL certanente non si otterr
nai un nessaggio del tipo Iessuna licenza disponibile
per eseguire questo sotvare", per non parlare dei rischi nel
basare i propri progetti di progrannazione sulle decisioni
dei proprietari dei linguaggi non ree.
5LIHULPHQWL
]1| http://acult,.ed.unuc.edu/7Esvalsh/Math Articles/
cna.htnl
]2| http://viki.jach.havaii.edu/pdl_viki-bin/viki/Cetting_
Started_vith_PDL/Installing_PDL_the quick and eas,
va,
]3| http://pdl.sourceorge.net/PDLdocs/Indexing.htnl
5LVRUVH
PDL vebpage - http://pdl.perl.org/
PDL or the inpatient - http://pdl.sourceorge.net/
PDLdocs/Inpatient.htnl
The PDL book - http://vvv.johnlape,re.con/pdl/pdldoc/
nevbook/index.htnl
IDL vebpage - http://vvv.ittvis.con/idl
MATLAB vebpage - http://vvv.nathvorks.con/
Cctave vebpage - http://vvv.octave.org/
Irs|an |/:||:n: pa||||::/: sa ||:n:: J| 7| Opn M|nJ Cam-
p:n L/J

va|uLazlone qua|lLaLlva del dlfferenLl |lnguaggl.
7$%(//$

/LQJXDJJLR 9HUVLRQH )ODJ
$OWR
OLYHOOR
6LQWDVVL
)XQ]LRQLPDWHPDWLFKH
HGL,2
3UH]]R
0
gcc 3.3.5 20050117
(prere|ease)
03 |o Pesslma Pesslmo Free
F0RlR^|77
gcc verslon 3.3.5 20050117
(prere|ease)
03 |o Pesslma Pesslmo Free
PDL 2.4.1 |essuno 5 Buona DlscreLo Free
lDL 6.2 |lnux xS6 m32 |essuno 5 DlscreLa Buono ^|Lo
M^lL^B
7.1.0.1S3 (R14)
5ervlce Pack 3
nodlsp|ay
nojvm
5 DlscreLa Buono ^|Lo
0cLave 2.1.64 (l6S65useLlnux) |essuno 5 DlscreLa Buono Free