Salve a tutti.
Una curiosità: ho scritto due funzioni del tutto equivalenti in C. Entrambe ricevono in input un valore intero e restituiscono 0 se il valore è dispari o un valore diverso se è pari (una funzione che controlla, insomma, se un numero è pari o meno).
Ho voluto, però, testare l'efficienza delle due funzioni per cui le ho sottoposte a numerosi test cronometrandone il tempo impiegato per l'elaborazione. Secondo le mie teorie la seconda delle funzioni doveva essere più veloce, ma dai risultati ottenuti ho scoperto, invece, che la classica (la prima) risulta essere più performante.
La mia domanda, quindi: i risultati che ho ottenuto sono dovuti al fatto che il compilatore che ho usato (Dev-C++) è un ottimo compilatore che riesce ad accorgersi della divisione per 2 della prima funzione, traducendo, di conseguenza, in modo più efficiente l'operazione tramite un bit-shift?
Oppure dipende da altro?
Posto le due funzioni:
La prima funzione è la classica: si controlla se il resto della divisione per 2 è 0 oppure no.codice:int pari1 (int x) { return !(x % 2); } int pari2 (int x) { return !(x & 1); }
La seconda, che ho pensato io, funziona in modo diverso: restituisce, semplicemente, il valore (negato, ovviamente) del bit meno significativo; se è 0, infatti, il numero è pari, altrimenti è dispari.
Secondo le mie teorie, un AND bit a bit dovrebbe essere un'operazione che richiede un solo tic di cloc, mentre il modulo dovrebbe richiederne di più: una divisione per 2 (tradotta in modo efficiente con un bit-shift destro) un prodotto e una differenza.
Qualcuno può illuminarmi su questa faccenda, spiegandomi perchè, invece, la prima viene eseguita più velocemente?
Ciao.![]()



Rispondi quotando