rápido tiempo transcurrido en linux

Estoy buscando una manera rápida de obtener el tiempo transcurrido entre dos llamadas de una función en C.

Consideré el uso de jiffies, pero no están disponibles en el mundo del usuario. Entonces, ¿debería usar getimeofday () o hay alguna forma más rápida de hacerlo?

Solo me interesa el tiempo transcurrido entre dos llamadas, para usar en una herramienta de referencia.

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

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

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

Sí, gettimeofday () sería suficiente si desea encontrar el tiempo real transcurrido. Si necesita encontrar el tiempo de CPU, puede usar clock (). En muchos casos, ambos enfoques darían un resultado similar (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

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

Si su kernel admite gettimeofday() como vsyscall (llamada de sistema virtual), entonces usarlo será más rápido que llamar a una llamada de sistema regular como clock() . Vea la presentación de Andrea Arcangeli para obtener información sobre cómo funciona vsyscalls.

Poco de 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 deseas. 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 

Los siguientes trabajos para mí en CentOS 6:

 #include  #include  #include  #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