Difftime devolviendo 0 cuando hay claramente una diferencia

Tengo el siguiente progtwig C99 que mide el rendimiento de las operaciones de división simple en relación con la adición. Sin embargo, la función difftime sigue devolviendo 0, aunque el progtwig está demorando varios segundos en procesar runAddition y runDivision con iterations establecidas en 1 billón.

 #include  #include  void runAddition(long long iterations) { long long temp; for (long long i = 1; i <= iterations; i++) { temp = temp + i; } } void runDivision(long long iterations) { long long temp; // Start at 1 to avoid division by 0! for (long long i = 1; i <= iterations; i++) { temp = temp / i; } } int main() { long long iterations = 1000000000; time_t startTime; printf("How many iterations would you like to run of each operation? "); scanf("%d", &iterations); printf("Running %d additions...\n", iterations); startTime = time(NULL); runAddition(iterations); printf("%d additions took %f seconds\n", iterations, difftime(time(NULL), startTime)); printf("Running %d divisions...\n", iterations); startTime = time(NULL); runDivision(iterations); printf("%d divisions took %f seconds\n", iterations, difftime(time(NULL), startTime)); } 

La cadena de formato espera un int ( %d ) y un double ( %f ). Tus argumentos son long long y double . Debe establecer la primera cadena de formato como %lld .

Cuando se empujan los argumentos en la stack para llamar a printf , se presiona long long con 8 bytes, y un double con 8 bytes también. Cuando la función printf lee la cadena de formato, primero espera un int en 4 bytes y un double en 8 bytes. printf obtiene el int correctamente ya que eres little-endian y los primeros cuatro bytes de tu long long son suficientes para representar el valor. printf obtiene el double por el que obtiene los últimos cuatro bytes del long long , seguido de los primeros cuatro bytes del double . Como los últimos cuatro bytes del long long son ceros, lo que printf piensa que es un doble comienza con cuatro bytes con valor cero, lo que da como resultado un valor muy pequeño para el double según la representación binaria de dobles.

Intente usar %lld en lugar de %d en el printf :

 printf("%lld additions t ^^^ 

Funciona bien después de este cambio.

Hacer que la temperatura sea volatile para que no se optimice. El comstackdor probablemente lo ve como una sección / función sin efectos secundarios.

Calcula la diferencia en segundos entre time1 y time2. ¿Tal vez tu diferencia de tiempo es menos de 1 segundo?

Salida su hora de inicio y finalización para verificar.

time () devuelve un time_t, que tiene una resolución de un segundo.

El tiempo requerido para runDivision () es inferior a un segundo; mil millones de operaciones en un núcleo multi-GHz tomará menos de un segundo.