So che col C eseguire una funzione richiede piu' tempo (si parla di millesimi di secondi, ovviamente) che eseguire il codice nella funzione corrente...
Volevo fare un benchmark per vedere quanto fosse questo tempo e l'ho fatto![]()
Ma i risultati m'hanno lasciato stupefattoVVoVe:
Ho fatto un programmino che esegue un miliardo di cicli... Una volta lo fa senza fare niente al loro interno, soltanto incrementando una variabile... La seconda volta invece richiama una funzione void che non fa niente di niente, non prende parametri e non restituisce valore...
Ecco i risultati:
dewell@myamd bench $ ./cfunctions
Tempo impiegato per eseguire 1000000000 cicli eseguendo ogni volta una funzione vuota: 49 secondi.
dewell@myamd bench $ ./cfunctions x
Tempo impiegato per eseguire 1000000000 cicli senza eseguire ogni volta una funzione vuota: 3 secondi.
VVoVe:
Se volete il codice per eseguire questo test sulle vostre macchine compilando il programma con altri compilatori (io ho usato il GCC) eccovi il codice:codice:#include <stdio.h> #include <time.h> #define LOOPS 1000000000 void use_func ( ); void not_use_func ( ); void func ( ); void usage ( char * progname ); int main ( int argc, char * argv [] ) { if ( argc == 1 ) use_func ( ); else if ( argc == 2 ) not_use_func ( ); else usage ( argv[0] ); return 0; } void use_func ( ) { time_t start; time_t end; int i; start = time ( NULL ); for ( i = 0; i < LOOPS; i ++ ) func ( ); end = time ( NULL ); printf ( "Tempo impiegato per eseguire %d cicli eseguendo ogni volta una funzione vuota: %d secondi.\n", LOOPS, (int) ( end - start ) ); } void not_use_func ( ) { time_t start; time_t end; int i; start = time ( NULL ); for ( i = 0; i < LOOPS; i ++ ); end = time ( NULL ); printf ( "Tempo impiegato per eseguire %d cicli senza eseguire ogni volta una funzione vuota: %d secondi.\n", LOOPS, (int) ( end - start ) ); } void func ( ) { } void usage ( char * progname ) { printf ( "Utilizzo: `%s': verra' eseguita alcuna funzione vuota per ogni loop del ciclo.\n" " `%s *': non verra' eseguita alcuna funzione vuota per ogni loop del ciclo.\n", progname, progname ); }
Ho anche un'altra domanda...
Il GCC permette di dichiarare alcune funzioni usando la direttiva inline col C, che con gli altri compilatori non dovrebbe essere presente poiche' e' una direttiva standard del C++, ma non presente nel C...
Per chi non sa cosa sia, la direttiva inline dovrebbe trasformare la funzione in una macro: dovrebbe cioe' sostituire i richiami alla funzione con il codice della funzione per velocizzarne il codice...
Ho provato a dichiarare inline la funzione func(), ma ottengo sempre gli stessi identici valori![]()
Sapreste spigarmi il motivo? Il GCC accetta la direttiva inline, ma non la utilizza?![]()
![]()

VVoVe:
Rispondi quotando