歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux/Unix環境下計算C程序運行時間

Linux/Unix環境下計算C程序運行時間可以通過clock, times, gettimeofday, getrusage來實現。

下邊分別說明其優缺點(該部分是從別的地方copy的)

clock是ANSI C的標准庫函數,關於這個函數需要說明幾點。

首先,它返回的是CPU耗費在本程序上的時間。也就是說,途中sleep的話,由於CPU資源被釋放,那段時間將不被計算在內。

其次,得到的返回值其實就是耗費在本程序上的CPU時間片的數量,也就是Clock Tick的值。該值必須除以CLOCKS_PER_SEC這個宏值,才能最後得到ss.mmnn格式的運行時間。在POSIX兼容系統中,CLOCKS_PER_SEC的值為1,000,000的,也就是1MHz。

最後,使用這個函數能達到的精度大約為10ms。

使用times的方法:

times的用法基本和clock類似,同樣是取得CPU時間片的數量,所不同的是要除以的時間單位值為sysconf(_SC_CLK_TCK)。

使用gettimeofday的方法:

用gettimeofday直接提取硬件時鐘進行運算,得到的結果的精度相比前兩種方法提高了很多。

但是也正由於它提取硬件時鐘的原因,這個方法只能計算程序開始時間和結束時間的差值。而此時系統中如果在運行其他的後台程序,可能會影響到最終結果的值。如果後台繁忙,系統dispatch過多的話,並不能完全真實反映被測量函數的運行時間。

使用getrusage的方法:

getrusage得到的是程序對系統資源的占用信息。只要指定了RUSAGE_SELF,就可以得到程序本身運行所占用的系統時間。

可以說是精度最高的測量方法了。

自己試用了這四種方法,感覺需要高精度測試的話,getrusage和gettimeofday都可以選擇。需要長時間測試的話,clock也是不錯的,尤其是考慮到它的通用性。

本人首先接觸的是gettimeofday,下邊詳細介紹這個函數的使用方法:

1. 包含頭文件sys/time.h.

2.定義兩個結構體 struct  timeval  start、struct  timeval  end及記錄時間的變量timer.

3. 將gettimeofday(&start,NULL)放在需要測的代碼的開始部分,將gettimeofday(&end,NULL)放在需要測的代碼的結束部分.

4.語句timer = 1000000 * (end.tv_sec-start.tv_sec)+ end.tv_usec-start.tv_usec可以使timer記錄代碼運行時間(時間單位為us).

5.printf("timer = %ld",timer) 打印出timer的值.

示例程序:

#include <stdio.h>
#include <sys/time.h>
int main()
{
  struct  timeval  start;
  struct  timeval  end;
  unsigned long timer;

  gettimeofday(&start,NULL);
  printf("hello world!\n");
  gettimeofday(&end,NULL);
  timer = 1000000 * (end.tv_sec-start.tv_sec)+ end.tv_usec-start.tv_usec;
  printf("timer = %ld us\n",timer);
  return 0;
}

Copyright © Linux教程網 All Rights Reserved