Al risveglio dal dopo Convegno Gt (strepitoso quest’anno) pieno di soddisfazione per la grande riuscita e per la grande qualità degli interventi, ma con qualche piccola considerazione su uno dei migliori e più utili interventi della prima giornata. Il preparatissimo Alessandro Martin ha messo in luce alcuni fattori molto attuali, viste le novità di google, sui tempi di caricamento delle pagine web e i modi per risolverli in modo veloce e più o meno semi-automatico, consigliando anche degli ottimi strumenti disponibili in rete.
Molti dei suoi concetti sono poi stati ripresi in un intervento di Tiziano Fogliata nella seconda giornata, che più nello specifico li ha applicati all’effettivo utilizzo nell’ottimizzazione di WordPress.
Durante il suo intervento ha fatto una premessa che rimane discutibile quando ha affermato che non è né l’ottimizzazione del database, né l’ottimizzazione del codice, né le performance del proprio host che influiscono sul fattore velocità di risposta, ma semplicemente bisogna lavorare sul frontend.
Non c’è alcun dubbio che il frontend sia un punto importante su cui lavorare in quanto è decisamente la parte più pesante dove possiamo andare a scremare tra ottimizzazione di CSS, Javascript, immagini e quant’altro, ma d’altro lato quando andiamo a parlare di siti di grosse dimensioni che devono andare a gestire enormi quantità di dati allora questo non è sempre vero (a tal proposito alla cena di domenica con Enrico Altavilla parlavamo di grosse quantità di dati da elaborare – in merito al suo software su google news).
Sul web “commerciale”, quello dei cms opensource e dello smanettone autodidatta, del php+mysql, le strutture dati che vengono utilizzate sono spesso uniformate e tendenzialmente l’approccio è quello di non considerare nemmeno la possibilità di ottimizzare gli algoritmi o quant’altro.
Partiamo dal presupposto che il tempo di esecuzione di un algoritmo dipende sostanzialmente dai dati di input e dalla potenza del calcolatore (CPU).
Quando si parla infatti di tempi di esecuzione degli algoritmi si fa riferimento alla “Complessità computazionale dell’algoritmo”. In questo contesto il tempo di esecuzione viene espresso in termini di numero di operazioni necessarie affinché l’algoritmo termini in modo da renderlo valido in tutti i tipi di calcolatori. La conseguenza di questo è che in modo evidente il codice che scriviamo e l’algoritmo che elaboriamo va a influire in modo decisivo sui tempi e abbraccia in modo importante anche le performance della macchina su cui viene eseguito.
Il tempo di esecuzione di un algortimo viene identificato con T(n), dove n è l’input, e la sua complessità computazionale con “O grande”.
L’algoritmo può essere risolto in modo ricorsivo o iterativo, tenendo in considerzione che il metodo ricorsivo anche se più leggibile è molto più costoso a livello di uso di CPU e RAM.
Ora non voglio addentrarmi troppo nella questione, ma voglio portare qualche piccolo esempio utile a comprendere quello di cui sto parlando.
Prenderò in considerazione alcuni piccoli algoritmi di ricerca che possono essere elaborati ipotizzando di dover cercare un valore “x” all’interno di un array di interi e ritornando la posizione dell’elemento cercato in caso di succeso e false altrimenti.
1 – Algoritmo di ricerca lineare [con complessità computazionale O(n)]
{code type=php}<?php
function RicercaLineare($array,$x)
{
for (i=0; i < sizeof($array); i++)
if ($array[$i]==$x) return $i;
return false;
}
?>
{/code}
2 – L’algoritmo di ricerca binaria (in forma ricorsiva) [con complessità computazionale O(log2n)]
La complessità della ricerca binaria è derivabile dal fatto che nel caso pessimo l’algoritmo esegue un
numero di divisioni per 2 del vettore pari a log2n.
Questo algoritmo necessità di un array già ordinato.
{code type=php}<?php
function RicercaBinaria($array,$x, $inizio, $fine)
{
if ($inizio>$fine) {
return false;
} else {
$m=($inizio+$fine)/2;
if ($array[$m]==$x) return $m;
if ($x<$array[$m])
return RicercaBinaria($array,$x,$inizio,$m-1);
else return RicercaBinaria($array,$x,$m+1,$fine);
}
}
?>{/code}
2 – L’algoritmo di ricerca binaria (in forma iterativa) [con complessità computazionale O(log2n)]
{code type=php}<?php
function RicercaBinariaIte($array, $dimensione, $x, $inizio, $fine)
{
$pivot = 0;
while ($iniziale<=$finale)
{
$pivot=($inizio+$fine)/2;
if ($x==$array[$pivot]) return $pivot;
else if (x<$array[$pivot]) $fine=$pivot-1;
else $inizio=$pivot+1;
}
return false;
}
?>{/code}
Questi semplici algoritmi possono essere trovati in qualsiasi buon libro di algoritmi ed è sempre bene utilizzare buoni algoritmi per velocizzare le proprie applicazioni e salvare risorse preziose perché un server meno carico è un server più performante.
La qualità del software è importante e cerchiamo di tenerla sempre in considerazione nella fase di sviluppo senza farla passare come non importante.
PAROLA CHIAVE best practice.
Ciao Andrea.
Mi fa piacere che tu abbia parlato del mio intervento in questo post e volevo ringraziarti.
Ne approfitto per fare un chiarimento. Nel mio intervento *non ho detto* che la velocità del codice, del DB e del server non hanno influenza nei tempi di caricamento del sito. Ho detto che nella maggioranza dei siti con cui abbiamo a che fare il fattore che influenza maggiormente il tempo di caricamento è la velocità del frontend.
Con questo non voglio dire che la qualità del software non sia importante o che la normalizzazione del DB non serva a nulla. Sono così importanti che le do per scontate 🙂
La mi considerazione su cosa pesi di più nelle performance di un sito è mutuata dagli studi di Yahoo! (nello specifico di Steve Souders) che sono a loro volta basati sull’osservazione della realtà: se prendi 10 siti del web italiano che frequenti di solito e visualizzi il diagramma a cascata del caricamento dei componenti (ad es. usando il net panel di firebug) di accorgerai che nella maggioranza dei casi il più grosso dispendio di tempo avviene innegabilmente nel front end. Ti dicevo di fare il confronto sul web italiano perché negli USA sono, come al solito, più avanti su questo argomento e a seguito dell’evangelizzazione di Yahoo! e Google sono già corsi ai ripari facendo un ottimo lavoro sulle performance.
Sto pensando di fare un post in proposito per spiegare meglio quello che sapevo sarebbe stato un passaggio controverso.
Ciao e grazie per avermi definito “preparatissimo” 😉
Ciao Alessandro,
un vero piacere ottenere la tua risposta !
Avevo capito bene che non intendevi trascurare questi fattori e infatti anche io ho specificato come tu dici che l’incidenza maggiore è nel frontend, ma il messaggio che è arrivato da come hai presentato la cosa è risultato un po’ fraintendibile ed allora ho pensato bene di provocarti (#evil) 😉 in modo da riuscire a chiarire in modo più esaustivo la cosa.
Come sappiamo entrambi ci vorrebbe molto più tempo di quello che si ha in un intervento per spiegare certe cose in modo esauriente ed è per questo che sfruttando il tuo intervento ho pensato che ne potesse nascere una disussione chiarificatrice e istruttiva per tutti.
Altra cosa che ci tenevo a mettere in evidenza è che parlando di SEO tosti e quindi di volumi alti di traffico il codice performante diventa secondo me un’esigenza non trascurabile per tutta una serie di fattori…e come anche tu hai detto…non solo perché Google lo ha detto !
Non devi ringraziare perché la tua preparazione è agli occhi di tutti…e complimenti ancora per l’intervento. Attendiamo i tuoi approfondimenti.
Ciao ciao