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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值