2009-09-04 14 views
9

Busco a una forma rápida de obtener el tiempo transcurrido entre dos llamadas de una función en Crápido tiempo transcurrido en Linux

I considerado el uso de unidades de tiempo, pero no están disponibles en el espacio de usuario. Entonces, ¿debería usar getimeofday() o hay alguna forma más rápida de hacerlo?

Solo estoy interesado en el tiempo reducido entre dos llamadas, para usar en una herramienta de referencia.

Respuesta

2

Si está en una arquitectura x86/x64 y está ejecutando en una sola CPU, puede considerar leer el contador de marca de tiempo en la CPU para obtener un recuento cíclico. Wikipedia tiene more information. Tenga en cuenta que este enfoque es menos útil si su aplicación se ejecuta en múltiples CPU, ya que cada CPU tendrá su propio TSC. También tenga cuidado con la escala de frecuencia si decide convertir ciclos -> unidades de tiempo.

+0

+1 para RDTSC ... – dmityugov

3

Sí, gettimeofday() sería suficiente si quiere encontrar el tiempo real transcurrido. Si necesita encontrar el tiempo de CPU, entonces puede usar clock(). En muchos casos, ambos enfoques darían resultados similares (a menos que haya un sueño o algún tipo de espera en el código). Un ejemplo de reloj() se puede encontrar aquí:
http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_19.html

9

Tome un vistazo a clock_gettime, que proporciona acceso a los temporizadores de alta resolución.

+1

clock_gettime() con la fuente CLOCK_MONOTONIC es preferible a la sincronización relativa. gettimeofday() es propenso a error si un usuario o proceso puede cambiar la hora actual. – KFro

9

Me gustaría obtener el tiempo del procesador a través de clock() de time.h. Para obtener valores útiles, convertir a través de milisegundos CLOCKS_PER_SEC:

clock_t start = clock(); 
// [...] 
clock_t end = clock(); 
unsigned long millis = (end - start) * 1000/CLOCKS_PER_SEC; 
+1

reloj() el tiempo no parece igual al tiempo real. http://stackoverflow.com/questions/556405/what-do-real-user-and-sys-mean-in-the-output-of-time1 – xhan

+0

después de la prueba el reloj() tiempo devuelve el sistema + tiempo de usuario pero no el tiempo real use gettimeofday en su lugar – xhan

+0

@xhan: depende de su caso de uso - para una herramienta de evaluación comparativa, el tiempo del procesador es probablemente una mejor medida que el tiempo de reloj de pared – Christoph

1

Si su núcleo soporta gettimeofday() como vsyscall (llamada al sistema virtual), a continuación, utilizando este será más rápido que llamar una llamada al sistema regular, como clock(). Consulte Andrea Arcangeli's presentation para obtener información sobre cómo funcionan las llamadas vsys.

0

Una adición tardía, sin embargo, el tiempo disponible en cualquier linux/unix puede ser una forma más liviana de lograr lo que desea. Aquí hay 2 ejemplos

time ls -l stuff* 
ls: stuff*: No such file or directory 
    0.01s real  0.00s user  0.00s system 


time -c run_script.csh` 

... 

real 1m22.38s 
user 0m14.67s 
sys  0m1.06s 
0

las siguientes obras para mí en CentOS 6:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

#if ! defined(_POSIX_C_SOURCE) 
# error "_POSIX_C_SOURCE undefined" 
#endif 

#if _POSIX_C_SOURCE < 199309L 
# error "_POSIX_C_SOURCE < 199309L" 
#endif 

int main(int, char**){ 
    struct timespec start, stop; 
    struct timespec stop; 
    if(clock_gettime(CLOCK_MONOTONIC, &start)) goto err_out; 
    if(clock_gettime(CLOCK_MONOTONIC, &stop )) goto err_out; 
    printf("start == {tv_sec: %d, tv_nsec: %d}\n", start.tv_sec, start.tv_nsec); 
    printf("stop == {tv_sec: %d, tv_nsec: %d}\n", stop.tv_sec, stop.tv_nsec); 
    printf("stop.tv_nsec - start.tv_nsec == %d\n", stop.tv_nsec - start.tv_nsec); 
    return EXIT_SUCCESS; 
err_out: 
    perror("clock_gettime"); 
    return EXIT_FAILURE ; 
} 

... aunque requiere librt:

$ make dur 
cc  dur.c -o dur 
/tmp/cc1yF58x.o: In function `main': 
dur.c:(.text+0x1c): undefined reference to `clock_gettime' 
dur.c:(.text+0x4e): undefined reference to `clock_gettime' 
collect2: ld returned 1 exit status 
make: *** [dur] Error 1 
$ LDFLAGS="-lrt" make dur 
cc -lrt dur.c -o dur 
$ ./dur 
start == {tv_sec: 206247, tv_nsec: 411717209} 
stop == {tv_sec: 206247, tv_nsec: 411759791} 
stop.tv_nsec - start.tv_nsec == 42582 
Cuestiones relacionadas