¿Cómo mido el tiempo en C?

4 minutos de lectura

avatar de usuario
serpiente

Quiero saber por cuánto tiempo (aproximadamente) se ejecuta algún bloque de código. Algo como esto:

startStopwatch();
// do some calculations
stopStopwatch();
printf("%lf", timeMesuredInSeconds);

¿Cómo?

  • @Pmod ¿Qué quiere decir con plataforma? Mi sistema operativo es Windows.

    – serpiente

    24 de agosto de 2010 a las 14:02

  • ¿Qué resolución desea lograr y cuántos gastos generales acumulados está dispuesto a tolerar?

    – Noah Watkins

    24 de agosto de 2010 a las 14:08

  • @Noah, puedo tolerar un error de un milisegundo

    – serpiente

    24 de agosto de 2010 a las 15:27

  • Un milisegundo es mucho tiempo. La mayoría de los relojes de software serán lo suficientemente buenos.

    – Noah Watkins

    24 de agosto de 2010 a las 18:14

avatar de usuario
KLee1

Puedes usar el clock método en tiempo.h

Ejemplo:

clock_t start = clock();
/*Do something*/
clock_t end = clock();
float seconds = (float)(end - start) / CLOCKS_PER_SEC;

  • +1: Agradable y simple. Sin embargo, ¿no necesitarás lanzar (end - start) a un punto flotante antes de la división si quieres obtener fracciones de segundo?

    – torak

    24 de agosto de 2010 a las 14:25

  • Tenga en cuenta que clock() mide el tiempo de la CPU, no el tiempo del reloj de pared (esto puede o no ser lo que usted quiere).

    – café

    25 de agosto de 2010 a las 3:09


  • @caf Si bien es cierto en Linux, clock() en realidad calcula la hora del reloj de pared en Windows: msdn.microsoft.com/en-us/library/4e2ess30.aspx

    – indefinido

    26/09/2014 a las 23:56

  • @undefined: no solo Linux, en realidad es el estándar C que dice “Los clock determina el tiempo de procesador utilizado”.. Supongo que en Windows puede decir simplemente que la mejor aproximación de la implementación al tiempo de procesador utilizado es el tiempo de reloj de pared utilizado.

    – café

    1 oct 2014 a las 13:12

  • Nota: Para cualquier persona confundida, CLOCKS_PER_SEC NO es la frecuencia de reloj de su CPU.

    – JAAAY

    27/11/2017 a las 20:50

avatar de usuario
Esteban

Puedes usar el tiempo.h biblioteca, específicamente la hora y diferencia de tiempo funciones:

/* difftime example */
#include <stdio.h>
#include <time.h>

int main ()
{
  time_t start,end;
  double dif;

  time (&start);
  // Do some calculation.
  time (&end);
  dif = difftime (end,start);
  printf ("Your calculations took %.2lf seconds to run.\n", dif );

  return 0;
}

(Ejemplo adaptado de la página web de difftime vinculada anteriormente).

Tenga en cuenta que este método solo puede dar segundos de precisión: time_t registra los segundos desde que Época UNIX (1 de enero de 1970).

  • Esto da sólo unos segundos de precisión. Y su ejemplo en realidad no usa el <ctime.h>.

    – Dummy00001

    24 de agosto de 2010 a las 15:15

  • Lo sentimos, la ‘c’ fue un error tipográfico: la biblioteca ctime se define en time.h. Y sí, solo da una precisión de segundos. Teniendo en cuenta que el cartel decía “aproximadamente”, lo consideré suficiente. Editaré mi respuesta para incluir el hecho de que solo dará segundos de precisión, si lo desea.

    – Esteban

    24 de agosto de 2010 a las 15:24

A veces es necesario medir tiempo astronómico en vez de tiempo de CPU (especialmente esto aplicable en linux):

#include <time.h>

double what_time_is_it()
{
    struct timespec now;
    clock_gettime(CLOCK_REALTIME, &now);
    return now.tv_sec + now.tv_nsec*1e-9;
}

int main() {
    double time = what_time_is_it();
    printf("time taken %.6lf\n", what_time_is_it() - time);
    return 0;
}

GetTickCount().

#include <windows.h>
void MeasureIt()
{
    DWORD dwStartTime = GetTickCount();
    DWORD dwElapsed;

    DoSomethingThatYouWantToTime();

    dwElapsed = GetTickCount() - dwStartTime;

    printf("It took %d.%3d seconds to complete\n", dwElapsed/1000, dwElapsed - dwElapsed/1000);
}

usaría el QueryPerformanceCounter y QueryPerformanceFrequency funciones de la API de Windows. Llame al primero antes y después del bloque y reste (actual − antiguo) para obtener el número de “marcas” entre las instancias. Divida esto por el valor obtenido por la última función para obtener la duración en segundos.

avatar de usuario
usuario357501

Si no necesita una resolución fantástica, puede usar GetTickCount(): http://msdn.microsoft.com/en-us/library/ms724408(VS.85).aspx
(Si es para algo que no sea su propio diagnóstico simple, tenga en cuenta que este número puede dar vueltas, por lo que deberá manejarlo con un poco de aritmética).

QueryPerformanceCounter es otra opción razonable. (También se describe en MSDN)

avatar de usuario
Daniel

La biblioteca C estándar proporciona la time función y es útil si solo necesita comparar segundos. Sin embargo, si necesita precisión de milisegundos, la forma más portátil es llamar timespec_get. Puede decir la hora con una precisión de nanosegundos, si el sistema lo admite. Sin embargo, llamarlo requiere un poco más de esfuerzo porque involucra una estructura. Aquí hay una función que simplemente convierte la estructura en un entero simple de 64 bits.

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

int64_t millis()
{
    struct timespec now;
    timespec_get(&now, TIME_UTC);
    return ((int64_t) now.tv_sec) * 1000 + ((int64_t) now.tv_nsec) / 1000000;
}

int main(void)
{
    printf("Unix timestamp with millisecond precision: %" PRId64 "\n", millis());
}

a diferencia de clockesta función devuelve una marca de tiempo de Unix, por lo que tendrá en cuenta correctamente el tiempo empleado en funciones de bloqueo, como sleep. Esta es una propiedad útil para comparar e implementar demoras que toman en cuenta el tiempo de ejecución.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad