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