您的位置:首页 > 其它

Two more accurate ways to get time elapsed than clock()

2007-08-08 21:20 435 查看
The following program shows these two ways.

#include <stdio.h>
#include <windows.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>

inline unsigned _int32 get_cycles()
{
_asm RDTSC
}

int main()
{
unsigned _int32 start = 0, end = 0, result;

LARGE_INTEGER lpoint,lpoint1,lpoint2;
QueryPerformanceFrequency(&lpoint);
LONGLONG freq = lpoint.QuadPart;
QueryPerformanceCounter(&lpoint1);
Sleep(1000);
QueryPerformanceCounter(&lpoint2);
printf("Frequency of timer: %ld/n",freq);
printf("It costs %1.10lf s./n",((double)lpoint2.QuadPart - lpoint1.QuadPart) / freq);

start = get_cycles();
Sleep(1000);
end = get_cycles();
result = end - start;
printf("It costs %u cycles./n", result);

start = get_cycles();
Sleep(1000);
end = get_cycles();
printf("Frequency of this cpu is: %lf GHz/n",(end - start) / 1000000000.0);

printf("Frequency of this cpu is: %xh MHz/n",cpu_info());

return 0;
}

QueryPerformanceFrequency() and QueryPerformanceCounter() work together to measure the time elapsed in a minimum unit of 0.1 millisecond. RDTSC instruction directly returns the cpu cycles elapsed, and can be converted to time by being divided by the cpu frequency. The instruction is more accurate when you want accurate result. But in common use, the functions, or even the clock(), can generate results of enough accuracy.

On Linux platform, the relative accurate way is to use gettimeofday(). The data structure to store the time is struct timeval. It has two data members, tv_sec and tv_usec, both of which are long integers. The usage is shown below.


#include <sys/time.h>


#include <iostream>


using namespace std;






int main() ...{


struct timeval start, end;


gettimeofday(&start, 0);


sleep(1);


gettimeofday(&end, 0);


cout << (1000000 * (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec)) / 1000000.0 << endl;


return 0;


}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: