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

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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章