Ho cercato di trovare un titolo adatto perché penso che questo contest possa essere utile a tanti!
A chi è più avanti nell'uso di PHP sarà di certo capitato di doversi scontrare con le pessime performance che si riescono ad ottenere da questo linguaggio di programmazione! Performance, le più delle volte, ottenute pensando di scrivere buon codice anche se in realtà per php non lo era abbastanza.
Per performance non intendo solo velocità di esecuzione ma anche memoria utilizzata: meno memoria viene utilizzata dal codice più pagine potranno essere eseguite senza che venga utilizzato lo swap del sistema
Con questo non voglio dire che le performance sono tutto, ma che comunque sono importanti per ottenere dei buoni lavori: se un vostro cliente deve aspettare un secondo per la creazione della pagina, più il download dei contenuti, è facile che a lung'andare si secchi a causa dell'aumentare della latenza per via dell'incremento dei dati presenti nel sistema.
Il contest è ovviamente aperto a tutti, non c'è alcun tipo di limitazione, l'importante è seguire alcuni semplici regole:
1° Prima di postare il vostro codice accertatevi che non c'è ne sia uno uguale
2° Se trovate del codice che fa la stessa cosa, invece di postare il vostro, prendete quello, modificatelo per come credete meglio, ed inserite il vostro nome tra gli autori, questo eviterà inutili test estremamente simili
3° Il punto 2°, ovviamente, non è valido se il vostro test e quelli simili che avete trovato tendono ad identificare aspetti diversi
4° TUTTO il codice che postate, cosa quindi accettata implicitamente al momento del posting nel thread, deve essere sotto licenza BSD, questo affinche il codice possa essere, in un secondo momento, inserito in un database e ed essere convertito in unità di testing gestite da un sistema centralizzato
Il quarto punto, anche se è l'ultimo, non lo è per importanza: lo scopo di questo contest è quello di fornire un servizio utile a tutti ed è quindi necessario che il codice sia sotto una licenza aperta, e la licenza BSD lo è veramente tanto!
Passando a fatti più concreti: il codice che verrà postato si dovrà occupare di eseguire N iterazioni, per N si intende un numero variabile, su M sistemi diversi per fare una stessa cosa.
Ovvero, se voglio misurare le performance di come un for, un foreach, un while/list/each e un while/current/next si comportano su una lista di 1000 elementi, senza quindi eseguire nessuna operazione all'interno, allora il codice deve acquisire subito prima del ciclo che esegue le N iterazioni sul sistema che sta per essere testato l'orario corrente, con relativi millisecondi, e poi questo deve essere riacquisito subito dopo il termine per poter calcolare il tempo impiegato complessivamente e va quindi calcolato il tempo medio di una operazione dividendo il tempo totale dello specifico metodo per le N iterazioni.
Come per il calcolo del tempo impiegato, anche i test sulla memoria dovranno essere eseguiti tutti nello stesso modo: subito prima e subito dopo i cicli va acquista la memoria utilizzata in quel dato momento
NOTA: se state usando windows è necessario che la versione di php sia la 5.2.1 o superiore mentre se state usando linux o avete, come per windows, una versione uguale o superiore alla 5.2.1 oppure la vostra versione di php deve essere stata compilata con --enable-memory-limit, cosa che potete scoprire lanciando la funzione phpinfo()
NOTA: secondo php non viene usata memoria nel codice di d'esempio che ho scritto per i test sulla e memoria, e non capisco se è dovuto a una super miracolosa ottimizzazione nel core di php o ad un calcolo strano, motivo per il quale per il momento non postate test per verificare le quantità di memoria usate dai vari codici perché devo verificare se con le versioni precedenti o meno c'è questa stessa anomalia
Il primo post del thread sarà un mio codice di test di esempio, che metterà a confronto questi quattro sistemi e, quando verranno postati i sistemi di confronto, dovrà essere seguito lo stesso schema, in modo da permettere una facile conversione a posteriori.
I premi, come in un qualsiasi contest, ci sono anche qua, anche se comunque vincono tutti: nel database, quando verrà creato, saranno inseriti i vostri nick/nomi e il link al vostro sito web in modo da visualizzare queste informazioni quando verrà visualizzato il test
La seconda fase, una volta terminato il contest, sarà quella di raccogliere tutto questo codice, convertirlo come già detto in unità di test, ed inserirlo in un database. Inoltre verrà creata una piccola piattaforma di testing che permetterà a chi vuole di eseguire tutti questi test sul priprio sistema per contribuire alla raccolta delle performance specifiche per configurazione, hardware e software.
Per postare dovete seguire questo struttura, che verrà ovviamente riportata anche nel primo test
Ovviamente, nel thread, oltre a postare il codice, potete postare, anzi dovete postare, suggerimenti, correzioni, aggiunte o quant'altro che possare sfruttare al meglio le informazioni che verranno raccolte
Ultima cosa, prima che me ne dimentico, i test dovranno funzionare con una versione la versione 5 o superiore di php, dato che la 4 va lentamente scomparendo
Come potete vedere, dentro il quote ci sta il modellino da utilizzare, e i TAG del forum sono stati inseriti con gli spazi tra le quadre in modo da permettere un semplice copia/incolla[ B ]AUTORE[ /B ]
nome o nomi degli autori del codice su più righe (non inserite per piacere link al proprio sito web dato che potrebbe essere inteso come spam, gli indirizzo dei propri siti web verranno raccolti al momento della creazione del database)
[ B ]DESCRIZIONE[ /B ]
In questo campo va inserita una dettagliata descrizione
[ B ]CATEGORIA[ /B ]
Una possibile categoria da utilizzare nel database quando questo verrà messo in piedi, non è detto che sia quella, anzi, però può servire come spunto per quando si creeranno le categorie per le ricerche online.
Ovviamente è possibile specificare più categorie, o categorie con sotto categorie separandole con uno slash, simile ad un url web quindi
[ B ]DIPENDENZE[ /B ]
Eventuali dipendenze come estensioni o file php esterni, con relativo link per il download, se questi sono necessari allo scopo del vostro test
[ B ]CODICE[ /B ]
[ PHP ]
- il codice va TASSATIVAMENTE inserito all'interno del tag PHP, deve essere indentato, commentato e facilmente leggibile!
- Il codice non deve essere complesso e all'interno dei cicli deve starci il minimo codice necessario!
- Le verifiche devono essere eseguite non su una singola iterazione ma su un numero elevato di iterazioni, come nell'esempio di sotto. Minimo mille iterazioni
- Lo stile del codice deve essere lo stesso, seguite quello postato nel mio post d'esempio
[ /PHP ]
qui c'è ne sta un modello senza i miei commenti
Per concludere: come vedrete nel mio primo post il codice deve essere eseguito, includendo dopo le definizioni del test e dopo la classe, un require_once al codice che effettivamente lancerà il test.[ B ]AUTORE[ /B ]
[ B ]DESCRIZIONE[ /B ]
[ B ]CATEGORIA[ /B ]
[ B ]DIPENDENZE[ /B ]
[ B ]CODICE[ /B ]
[ PHP ]
[ /PHP ]
Qui c'è il file, che ho chiamato TimeUnitTesting.php:
NOTA: non includete output o risultati pleaseCodice PHP:
<?php
// Elimina la durata massima della pagina
set_time_limit(0);
// Acquisisce l'orario di inizio del test
$startTotalTestDuration = microtime(true);
// Cicla i metodi
foreach($methods as $method => $description)
{
// Stampa delle informazioni a video
echo "[B]{$method}[/B]: {$description}
\r\n";
echo "
\r\n";
flush();
// Acquisisce la durata del test
$testDuration = call_user_func_array(array($class, $method), array($iterations, $dataToTest));
// Stampa le informazioni acquisite
echo 'Durata totale del test: [B]' . sprintf('%0.20f', $testDuration) . "[/B]
\r\n";
echo 'Durata media di una singola operazione nel test: [B]' . sprintf('%0.20f', ($testDuration / $iterations)) . "[/B]
\r\n";
// Separa il test dal successivo
echo "
\r\n";
echo "
\r\n";
}
echo "TEST ESEGUITO CORRETTAMENTE!
\r\n";
echo 'Il test è durato: [B]' . sprintf('%0.20f', microtime(true) - $startTotalTestDuration) . '[/B] secondi';
?>