[Top][All Lists]
[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
- measuring elapsed time on mingw,
Bruno Haible <=