2013年1月6日 星期日

Time.h 研讀



Time.h : http://zh.wikipedia.org/zh-tw/Time.h


因為在計算P2P偵測流量必須要用到,因此稍微拜讀了一下


wiki就蠻詳盡的了 所以乾脆就貼上來


在"標準" C/C++函式庫裡 也就是 time.h 時間用clock()函數的精準度只有到 ms


若要精準到 微秒(us) 在linux 和win 有不同的做法


神奇的是 clock 在linux man page 查到的CLOCKS_PER_SEC = 1000000


也就是說每個 tick 的單位是 微秒(microsecond) us


但是在windows 的系統下用VS 查到的CLOCKS_PER_SEC =1000


所以單位是 毫秒 (millisecond) ms


關於這個問題再windows 下驗證過後是毫秒沒錯


在linux 我就沒有特別去驗證了 (我是懶惰鬼以後遇到再說XD)







若要計算的更精準一點 時間推算來到 微秒 (microsecond) us


參考win <Windows.h>


附上我自己寫的Code

getTickTime(LARGE_INTEGER *tickTime){ 
QueryPerformanceCounter(tickTime);
}
LONGLONG diffTime_us(LARGE_INTEGER startTime,LARGE_INTEGER endTime){ LARGE_INTEGER CUPfreq; 
 LONGLONG llLastTime; 
 QueryPerformanceFrequency(&CUPfreq); 
 llLastTime = 1000000 * (endTime.QuadPart - startTime.QuadPart) / CUPfreq.QuadPart; 
 return llLastTime;
}
int main(){
LARGE_INTEGER start,
end;getTickTime(&start);
Sleep(100);
getTickTime(&end);
diffTime_us(start,end);
return 0;
}



linux 就請man <sys/time.h> ,貼上轉錄來的source code當參考

#include <sys/time.h>
#include <stdio.h>
int main(){
  struct timeval tv, tv2;
  unsigned long long start_utime, end_utime;
  gettimeofday(&tv,NULL);
  start_utime = tv.tv_sec * 1000000 + tv.tv_usec;

  usleep(1000);
  gettimeofday(&tv2,NULL);
  end_utime = tv2.tv_sec * 1000000 + tv2.tv_usec;

  printf(" runtime = %llu\n", end_utime - start_utime );
}




一般來說標準涵式庫time.h 可以精準到秒、毫秒(ms)對大部分的情況就已經夠用了


針對特殊情況才會用到上面兩種方法


然而到底能不能精準到 us 其實最主要還是看硬體支不支援(大部分都是支援的)