PHP: ottimizzare le nostre applicazioni – parte 2
Eccoci alla seconda parte dell’articolo sull’ottimizzazione del nostro codice PHP. Purtroppo un pò in ritardo e me ne scuso ma in questi giorni sto avendo parecchi problemi con il mio hoster e spero vivamente che siano finiti. Comunque veniamo a noi.
La scorsa volta ci siamo lasciati con dei consigli sugli operatori e le strutture base del linguaggio. Oggi invece ci occupiamo delle stringhe e degli array.
Incominciamo con la manipolazione delle stringhe che occupano all’incirca l’80% dei nostri script.
Stringhe
- utilizzo appropriato di strlen()
E’ sicuramente una delle funzioni più utilizzate sulle stringhe. Essa restituisce la lunghezza della stringa, controllo che spesso viene effettuato per verificare che la stringa abbia una dimensione minima. In questo caso e, in generale, per verificare se una stringa non è vuota è più indicato il costrutto isset() già contenuto in php e sicuramente di più veloce esecuzione. Allego due semplici esempi che ci fanno comprendere come usarlo nei due casi.
//controllo l'esistenza di una stringa $string = 'Lorem ipsum dolor sit amet'; if( strlen($string ) echo "stringa non vuota"; //strlen if( isset($string) ) echo "stringa non vuota"; //isset //controllo lunghezza stringa maggiore di 8chars if( strlen($string) > 8 ) echo "stringa corretta"; //strlen if( isset($string[8]) ) echo "stringa corretta"; //isset
- dimentica l’esistenza della funzione printf()
Non stiamo più usando il C! Ok è un bel linguaggio e tuttora mi piace molto ma stiamo usando il PHP. Ancora oggi molte persone utilizzano funzioni C-like che sono ampliamente superate in PHP in fatto di prestazioni ed efficienza. La funzione printf() è lentissima, richiede parametri che devono essere parsati ed ha un altissimo overhead. Aboliamola
- preferisci funzioni preg_ alle funzioni eregi_ nelle regular expression
In questo caso non è tanto questione di prestazioni o di spazio di memoria bensì di compatibilità. Il set di funzioni ereg_ è stato abolito nelle ultime versioni di PHP proprio per lasciar spazio al set preg_ che sicuramente è più dinamico e completo.
- funzioni regex vs funzioni manipolazione stringhe
- strcasecpm()
Non so in quanti sono a conoscerla, però è un esempio lampante di quando è preferibile usare una funzione per stringhe piuttosto di una per la gestione delle espressioni regolari. Tale funzione controlla che due stringhe siano uguali, ignorandone le differenze tra maiuscolo e minuscolo. Ovvio che il medesimo controllo si può fare con una regular expression ma la differenza di tempo di esecuzione è davvero impressionante!
- preg_replace() vs str_replace()
Idem come sopra. La funzione str_replace è molto più veloce (e direi semplice) rispetto ad una preg_replace. Quando possibile quindi è buona norma preferire la seconda alla prima.
Sarebbero molti altri gli esempi che potrei fare ma è sufficiente leggere la lista delle funzioni a disposizione per le stringhe per capire quando è preferibile scegliere una funzione anzichè una regex.
- ctype vs regular expression
Quando dobbiamo verificare la consistenza dei dati provenienti da una form spesso abbiamo a che fare con tipologie di dato omogenee; ad esempio verificare che un campo sia tutto di numeri, sia tutto in minuscolo, ecc. Tali controlli vengono effettuati con una semplicissima espressione regolare che ci toglie il pensiero. Possiamo invece ridurre drasticamente il tempo di esecuzione dello script se, quando possibile, preferiamo funzioni del set ctype all’utilizzo di una espressione regolare. Per maggiori informazioni potete leggere la documentazione sul sito di PHP.
Array
- dichiara l’array prima di usarlo
Dichiarare l’array al momento dell’utilizzo rallenta l’esecuzione dello script. E’ buona norma quindi definire una variabile come array prima di usarla come tale.
//dichiarare una var come array $array = Array();
- array_push vs $array[]
La funzione array_push() consente di inserire nello stack dell’array gli elementi passati come parametro. Tale operazione è possibile effettuarla anche senza chiamare una funzione attraverso una semplice riga di codice come la seguente.
//inserire un elemento nello stack $array[] = "Lorem";
Quando l’elemento da inserire è uno soltanto è utile, e anche conveniente, utilizzare il codice in esempio.
- array_push(): 0.20646
- $array[]: 0.17737
Quando invece gli elementi da inserire sono più di uno è più indicato utilizzare la funzione array_push() sia per comodità che per velocità di esecuzione.
- array_push(): 0.21075
- $array[]: 0.23412
Vediamo le differenze di codice da utilizzare nel primo e nel secondo caso.
//dichiararo l'array $array = Array(); //inserire un elemento array_push( $array, "Lorem" ); $array[] = "Lorem"; //inserire più elementi // - array_push() array_push( $array, "Lorem", "ipsum", "dolor" ); // - $array[] $array[] = "Lorem"; $array[] = "ipsum"; $array[] = "dolor";
- utilizza l’apostrofo nella chiave dell’array
Detto in parole più comprensibili, una definizione del tipo $array['id'] è 7 volte più veloce di $array[id].
- ottimizzare la ricerca all’interno di un array
Questo argomento è molto delicato. Il problema della ricerca all’interno di una struttura dati è da più di 50 anni che viene discusso e non tutti gli algoritmi di ricerca esistenti finora sono di certo performanti sia in fatto di tempo che di spazio di esecuzione. Non è però compito dell’articolo dare lezioni di Algoritmi, anche perchè richiede un semestre di corso per impararlo.
Compito dell’articolo invece è quello di consigliare un metodo veloce per ricercare un elemento all’interno di un array.
I metodi che tutti conosciamo sono due principalmente; utilizzare un ciclo for oppure la funzione in_array(). Quindi entrambi gli esempi seguenti altro non fanno che cercare un elemento e ritornare vero o falso a seconda che sia presente o meno.
$array =
array (
'Luca',
'Marco',
'Matteo',
'Giovanni'
);
$search = "Matteo";
//ciclo for
for($i=0; $<sizeof($array); $i++) {
if( $search == $array[$i] )
return true;
else
return false;
}
//in_array()
return in_array($search, $array);
Fin qui nulla di nuovo. Entrambi, chi con più tempo o più spazio, restituiscono vero o falso. Possiamo però fare di meglio in termini di tempo di esecuzione. Ovvio che se l’array conterrà una decina di valori la funzione in_array() è più che sufficiente per adempiere al dovere; se invece l’array è di notevoli dimensioni possiamo utilizzare un piccolo accorgimento. Il codice seguente restituisce anch’esso vero o falso ma con tempo nettamente inferiore alla funzione in_array(). Vediamo come:
$array =
array (
'Luca' => 1,
'Marco' => 1,
'Matteo' => 1,
'Giovanni' => 1
);
$search = "Matteo";
return( isset( $array[ $search ] ) );
Il trucchetto consiste nell’usare i valori dell’array come chiavi e settarle tutte ad 1. La funzione isset() quindi va a verificare se esiste il campo con quella chiave restituendo vero o falso. E’ scomoda e non sempre realizzabile come soluzione ma vi garantisco che con array molto grandi (anche più di mille risultati) i tempi si riducono davvero di molto.
In principio era mia intenzione chiudere qui l’articolo ma ho notato che è venuto molto più lungo di quanto mi aspettassi per cui ho preferito rimandare la conclusione con l’OOP nella prossima parte. Non so voi ma io a leggere un articolo lunghissimo mi annoio. A presto
Sommario:
- PHP: ottimizzare le nostre applicazioni – (Consigli base, Strutture di controllo e cicli)
- PHP: ottimizzare le nostre applicazioni – parte 2 - (Stringhe, Array)
- PHP: ottimizzare le nostre applicazioni – parte 3 – (OOP, MySQL)
Articolo letto 918 volte.
Post correlati:
- PHP: ottimizzare le nostre applicazioni
- PHP: convertire “\n” in “<br />” e viceversa
- PHP: usare le regular expression – parte 1
- PHP: proteggere un indirizzo email su internet
- Colorare codice php
- PHP: usare le regular expression – parte 2
- PHP: funzione per visualizzare le ultime immagine inserite in flickr
- PHP: ottimizzare le nostre applicazioni – parte 3
- jQuery: 10 tecniche per migliorare e ottimizzare i nostri script
- Il foreach in php
























Back to top








Cellulare: (+39) 340-8652066
Mail:
WLM:
Non vedo l’ora di vedere la terza parte. Se posso dare il mio contributo, aggiungerei che quando si fa una ricerca con un for in un array, si può mettere un break al ritrovamento per uscire dal ciclo.
Sicuramente hai ragione! Ho omesso la cosa in quanto una ricerca con for è molto lenta rispetto ad una in_array() però effettivamente break può essere usato anche in altri ambiti per cui è sicuramente un’ottima pratica.
Grazie della segnalazione