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;
}
#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;
}
相关文章推荐
- helper function: compare two SYSTEMTIME, to get time span
- undefined reference to `clock_gettime' 链接错误的解决方案
- undefined reference to `clock_gettime' 链接错误问题解决(转)
- Two ways to get HtmlTextWriter for HTML rendering
- Two ways to get HtmlTextWriter for HTML rendering
- Need more time to read? Get rid of your TV.没时间读书?远离电视!
- How to get a job paying more than $100,000 a year
- undefined reference to `clock_gettime' 链接错误问题解决
- undefined reference to `clock_gettime'
- More than one way to get the max of 3 numbers.
- undefined reference to `clock_gettime'
- undefined reference to `clock_gettime' 链接错误问题解决
- (.text+0xb3a): undefined reference to `clock_gettime'
- Two ways to get HtmlTextWriter for HTML rendering
- libQtCore.so: undefined reference to `clock_gettime'
- 使用opencv 2.2静态库时: undefined reference to `clock_gettime' 链接错误问题解决
- undefined reference to `clock_gettime' 链接错误问题解决
- 编译错误:undefined reference to `clock_gettime'
- [tip debugging]Attach VS debugger to more than one process at the same time
- FC14下错误 /usr/bin/ld: libvalhalla-test.o: undefined reference to symbol 'clock_gettime@@GLIBC_2.2'