bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

measuring elapsed time on mingw


From: Bruno Haible
Subject: measuring elapsed time on mingw
Date: Sun, 4 Apr 2010 11:41:21 +0100
User-agent: KMail/1.9.9

Hi,

Just a side note about how to measure elapsed time on mingw.
(I needed this in order to evaluate how to implement nanosleep on mingw.)

Summary:
  - GetSystemTimeAsFileTime, _ftime, gettimeofday (from newer mingw runtimes)
    all have about 15.6 ms resolution.
  - QueryPerformanceCounter [1] has a resolution of 0.5 ms or higher.

There is an explanation how to implement the equivalent of gettimeofday with
a combination of GetSystemTimeAsFileTime and QueryPerformanceCounter [2],
but it appears quite complex, and overkill for gnulib.

As witness, here's a test program that busy-loops for a certain time and
then outputs the time difference, measured according to different system calls:

================================ gettime-res.c ================================
#include <sys/time.h>
#include <sys/timeb.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main (int argc, char *argv[])
{
  int count = atoi(argv[1]);
  FILETIME ft_before, ft_after;
  struct _timeb tb_before, tb_after;
  struct timeval tv_before, tv_after;
  LARGE_INTEGER pcfreq;
  LARGE_INTEGER pc_before, pc_after;
  int i, j;

  if (!QueryPerformanceFrequency (&pcfreq))
    printf ("QueryPerformanceFrequency failed\n");

  GetSystemTimeAsFileTime (&ft_before);
  _ftime (&tb_before);
  gettimeofday (&tv_before, NULL);
  if (!QueryPerformanceCounter (&pc_before))
    printf ("QueryPerformanceCounter failed\n");


  for (i = 0; i < count; i++)
    for (j = 0; j < 10000; j++)
      ;

  GetSystemTimeAsFileTime (&ft_after);
  _ftime (&tb_after);
  gettimeofday (&tv_after, NULL);
  if (!QueryPerformanceCounter (&pc_after))
    printf ("QueryPerformanceCounter failed\n");

  printf ("GetSystemTimeAsFileTime %ld *0.1us\n"
          "_ftime %ld ms\n"
          "gettimeofday %ld us\n"
          "QueryPerformanceCounter %ld (freq %ld) = %g s\n",
          (ft_after.dwHighDateTime - ft_before.dwHighDateTime) * 0x10000 + 
ft_after.dwLowDateTime - ft_before.dwLowDateTime,
          (tb_after.time - tb_before.time) * 1000 + tb_after.millitm - 
tb_before.millitm,
          (tv_after.tv_sec - tv_before.tv_sec) * 1000000 + tv_after.tv_usec - 
tv_before.tv_usec,
          (long) (pc_after.QuadPart - pc_before.QuadPart), (long) 
pcfreq.QuadPart, (double)(pc_after.QuadPart - pc_before.QuadPart) / (double) 
pcfreq.QuadPart);
  return 0;
}
===============================================================================

And its results on Windows XP:

$ ./gettime-res 100  
GetSystemTimeAsFileTime 156250 *0.1us
_ftime 16 ms
gettimeofday 15625 us
QueryPerformanceCounter 18631 (freq 3579545) = 0.00520485 s

$ ./gettime-res 200
GetSystemTimeAsFileTime 156250 *0.1us
_ftime 16 ms
gettimeofday 15625 us
QueryPerformanceCounter 36574 (freq 3579545) = 0.0102175 s

$ ./gettime-res 300
GetSystemTimeAsFileTime 156250 *0.1us
_ftime 15 ms
gettimeofday 15625 us
QueryPerformanceCounter 54852 (freq 3579545) = 0.0153237 s

$ ./gettime-res 400
GetSystemTimeAsFileTime 156250 *0.1us
_ftime 16 ms
gettimeofday 15625 us
QueryPerformanceCounter 72040 (freq 3579545) = 0.0201255 s

$ ./gettime-res 400
GetSystemTimeAsFileTime 156250 *0.1us
_ftime 16 ms
gettimeofday 15625 us
QueryPerformanceCounter 72194 (freq 3579545) = 0.0201685 s

$ ./gettime-res 400
GetSystemTimeAsFileTime 156250 *0.1us
_ftime 15 ms
gettimeofday 15625 us
QueryPerformanceCounter 72201 (freq 3579545) = 0.0201704 s

$ ./gettime-res 400
GetSystemTimeAsFileTime 156250 *0.1us
_ftime 16 ms
gettimeofday 15625 us
QueryPerformanceCounter 73738 (freq 3579545) = 0.0205998 s

$ ./gettime-res 500
GetSystemTimeAsFileTime 312500 *0.1us
_ftime 31 ms
gettimeofday 31250 us
QueryPerformanceCounter 90478 (freq 3579545) = 0.0252764 s

$ ./gettime-res 500
GetSystemTimeAsFileTime 312500 *0.1us
_ftime 31 ms
gettimeofday 31250 us
QueryPerformanceCounter 91936 (freq 3579545) = 0.0256837 s

Bruno


[1] http://msdn.microsoft.com/en-us/library/ms644904(VS.85).aspx
[2] http://msdn.microsoft.com/en-us/magazine/cc163996.aspx




reply via email to

[Prev in Thread] Current Thread [Next in Thread]