Appendice A. Suggerimenti per gli sviluppatori
- utilizzo dei thread.
- i wake-up della CPU non necessari e l'uso non efficiente dei processi di attivazione. Se necessario eseguire un processo di attivazione (race to idle), eseguire l'intero processo ed il più velocemente possibile.
- utilizzo non necessario di
[f]sync()
. - interrogazioni attive non necessarie o brevi timeout regolari. (Reazione agli eventi).
- utilizzo non efficiente dei processi di attivazione 'wake-up'.
- accesso inefficiente del disco. Utilizzo di buffer molto grandi per evitare un accesso del disco frequente. Scrivere un blocco molto grande per volta.
- utilizzo inefficiente dei timer. Se possibile raggruppare i timer attraverso le applicazioni (oppure attraverso i sistemi).
- I/O eccessivo, consumo energetico, o utilizzo della memoria (incluso perdite di memoria)
- esecuzione di computazione non necessaria.
A.1. Utilizzo dei thread
Python utilizza il Global Lock Interpreter[1], per questo motivo il threading sarà utile solo per operazioni I/O significative. Unladen-swallow [2] è una implementazione più veloce di Python attraverso la quale sarà possibile ottimizzare il vostro codice.
I thread di Perl sono stati originariamente creati per applicazioni in esecuzione senza il forking (come ad esempio i sistemi operativi Windows a 32-bit). Nei thread di Perl i dati vengono copiati per ogni thread (Copy On Write). Per impostazione predefinita i dati non vengono condivisi poichè gli utenti dovrebbero essere in grado di definire il livello di dati da condividere. Per tale processo il modulo threads::shared deve essere incluso. Tuttavia il modulo non copierà solo i dati (Copy On Write), ma creerà anche delle variabili utilizzando una quantità maggiore di tempo rendendolo più lento. [3]
I thread C condividono la stessa memoria, ogni thread ha un proprio stack ed il kernel non deve creare nuovi descrittori per il file ed assegnare nuovo spazio di memoria. C può utilizzare il supporto di un numero maggiore di CPU per più thread. Per questo motivo e per massimizzare le prestazioni, usare un linguaggio low-level come ad esempio C o C++. Se si utilizzo un linguaggio di programmazione considerate la scrittura di un C binding. Utilizzare un profiler per identificare le sezioni con una prestazione scadente del codice. [4]