Estoy tratando de medir el tiempo transcurrido en Linux. Mi respuesta volviendo cero, lo que no tiene sentido para mí. A continuación es la manera de medir el tiempo en mi programa.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
main()
{
double p16 = 1, pi = 0, precision = 1000;
int k;
unsigned long micros = 0;
float millis = 0.0;
clock_t start, end;
start = clock();
//This section calculates pi
for(k = 0; k <= precision; k++)
{
pi += 1.0 / p16 * (4.0 / (8 * k + 1) - 2.0 / (8 * k + 4) - 1.0 / (8 * k + 5) - 1.0 / (8 * k + 6));
p16 *= 16;
}
end = clock();
micros = end - start;
millis = micros / 1000;
printf("%f\n", millis); //my time keeps being returned as 0
printf("this value of pi is : %f\n", pi);
}
- Supongo que te refieres a que el código está entre las llamadas a
clock()
- consulte cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_19.html
- Me acaba de actualizar el código para mostrar lo que está en entre dicho.El problema que estoy teniendo es el tiempo volviendo a 0
- ¿qué acerca de la gnu
time
programa? o, alternativamente, el comando de bashtime
?
Para empezar se necesita el uso de aritmética de punto flotante. Cualquier valor entero dividido por una mayor entero valor será cero, siempre.
Y, por supuesto, usted realmente debe hacer algo entre el inicio y el final de los tiempos.
Por cierto, si usted tiene acceso a
gettimeofday
normalmente se prefiere sobreclock
ya que tiene mayor resolución. O tal vezclock_gettime
que tiene mayor resolución.man
de comandos en linux.millis = micros / 1000.0f;
Tres alternativas
clock()
gettimeofday()
clock_gettime()
clock_gettime()
va hasta la precisión de nanosegundos, y apoya a los 4 relojes.CLOCK_REALTIME
Todo el sistema de reloj de tiempo real. La configuración de este reloj requiere privilegios adecuados.
CLOCK_MONOTONIC
Reloj que no se puede establecer y representa monótona de tiempo, ya que algunos no especificado punto de partida.
CLOCK_PROCESS_CPUTIME_ID
De alta resolución de cada proceso temporizador de la CPU.
CLOCK_THREAD_CPUTIME_ID
Hilo específico de la CPU en tiempo de reloj.
Se puede utilizar como
Nota: El reloj() función que devuelve el tiempo de CPU para el proceso, no la hora del reloj de pared. Creo que esto es lo que el OP estaba interesado en. Si la hora del reloj de pared es la deseada, entonces gettimeofday() es una buena opción como se sugiere por una anterior respuesta. clock_gettime() puede hacer uno si su sistema admite; en mi linux embedded system clock_gettime() no es compatible, pero clock() y gettimeofday() son.
Siguiente es el código para obtener tiempo de reloj de pared utilizando gettimeofday()
Intentar Sunil D S la respuesta, pero el cambio de micros de unsigned long a tipo float o double, como este:
Como alternativa, puede utilizar rusage, como este:
Unidades y la precisión dependerá de cuánto tiempo desea medir, pero cualquiera de estos debe
proporcionar una exactitud razonable para ms.
Cuando se divide, usted podría terminar con un decimal, por lo tanto, usted necesita un flaoting número de punto para almacenar el número de mili segundos.
Si usted no utiliza un punto flotante, la parte decimal se trunca. En su pieza de código, el inicio y el final son CASI los mismos. Por lo tanto el resultado, después de la división, cuando se almacena en un tiempo es «0».
Hay dos problemas con el código tal como está escrito.
Según
man 3 clock
, la resolución declock()
es enCLOCKS_PER_SEC
incrementos por segundo. En un reciente-ish Cygwin sistema, es de 200. Basándose en los nombres de las variables, se espera que el valor de 1.000.000.Esta línea:
calculará el cociente como un entero, porque ambos operandos son enteros. La promoción a un tipo de punto flotante se produce en el momento de la asignación a
millis
, momento en el que la parte fraccionaria ya ha sido descartado.Para calcular el número de segundos transcurridos utilizando
clock()
, usted necesita para hacer algo como esto:Sin embargo, es casi seguro que no se consigue una precisión de milisegundos. Para eso, usted tendrá que usar la
gettimeofday()
oclock_gettime()
. Además, es probable que desee utilizardouble
en lugar defloat
, porque usted está probablemente va a terminar restar números muy grandes con una muy pequeña diferencia. El ejemplo que usaclock_gettime()
sería:Desde
NANO_PER_SEC
es un valor de punto flotante, la división de operaciones se llevan a cabo en punto flotante.Fuentes:
man
páginas paraclock(3)
,gettimeofday(3)
, yclock_gettime(3)
.El C Programación Idioma, Kernighan y Ritchie