Il blog di uforob

QUANTO COSTA NON FARE NIENTE


Non voglio parlare di quelli che per scelta più o meno consapevole non lavorano e del loro costo sulla società, quelli che in giapponese si chiamano hikikomori. Questo articolo indica quante risorse servono con diversi linguaggi per fare un programma che non faccia niente. In realtà il programma testato non fa veramente niente, è un ciclo vuoto infinito. La cosa è leggermente diversa perché con un ciclo vuoto il programma deve ESEGUIRE continuamente un'istruzione di salto, un programma che non facesse niente sarebbe terminato subito e mi sarebbe stato difficile valutare l'occupazione di memoria e CPU.Javapublic class Loop {    /**     * @param args     */    public static void main(String[] args) {                while(true);    }}Il file jar eseguibile esportato con Eclipse (che quindi include altre classi da JDT) è grande 7986 byte (8KB) e all'avvio occupa tra il 96 e il 100% di CPU e 6,3 MiB di RAMPythonwhile True:    passLo script è un file di testo che occupa solo 18 byte. L'esecuzione occupa tra il 94 e il 100% di CPU e 1,7 MiB di RAM.Cint main(){    while(1);    return 0;}File di 7280 byte. Occupa tra il 98 e il 100% di CPU e 60 KiB di RAM.C++Il sorgente è lo stesso di prima compilato con g++ invece di gcc (avrei potuto togliere il return e usare il tipo bool di C++ ma così il confronto è più equo anche se il return è comunque aggiunto dal compilatore, non so invece quanto la compilazione dei bool sia sovrapponibile al metodo spartano del C per cui 0 è falso e tutti gli altri valori sono vero). File di 7282 byte. Il consumo di memoria e di CPU ha oscillato di più (intorno al 98 o 100 % di CPU e ha toccato anche 90, la RAM dopo un po' è scesa da 60 a 56 KiB).Bashwhile truedo:doneTra 96 e 98% e 156 KiB di RAM.Windows Batch:sgoto sFile di 10 byte. Tra 1 e 5% di CPU e 1460 KB di RAMQuesto ha la particolarità che in effetti stampa anche l'istruzione "goto s" sulla linea di comando e quindi è molto meno vicino al "non fare niente".ConclusioneI risultati sono un po' falsati perché per Java, Python, Bash e Windows Batch (insomma tutti tranne C e C++ che sono compilati) risulta sul processo la dimensione di tutto l'ambiente comunque direi che il vincitore è Python che bilancia l'occupazione dei sorgenti e delle risorse runtime. Anche C/C++ però bisogna considerare che i sorgenti devono esser compilati invece il file Python da 18 byte è bell'e che pronto a essere dato in pasto all'interprete senza dover fare prima alcun'altra operazione. Windows Batch è simile, anzi usa meno RAM e il file è più piccolo però è fuori gara perché effettua le stampe (l'effetto è diverso da una finestra con una scritta ferma e un cursore lampeggiante).DettagliPer chi se lo stesse chiedendo tutto questo è nato perché a lavoro dovevo testare uno script che facesse ripartire un programma Java terminato e ho fatto il loop descritto come prova.Il computer utilizzato ha un processore Intel® Core™2 Duo E6750 (2.66GHz) e 2GB di RAM.Tutte le prove sono state effettuate con Ubuntu 12.04.4 LTS "precise pangolin" a 32 bit, tranne il Windows batch che è stato provato su Windows XP Professional Service Pack 3 (32 bit) con lo stesso computer