C++實現測試函式執行時間函式
阿新 • • 發佈:2018-12-20
使用方法:
gettime(函式名,[要測試函式的引數,在0~3個範圍內],時間單位)
// 時間單位如果不寫,預設為毫秒。
// 時間單位的格式:
// ns 納秒
// us 微秒
// ms 毫秒
// s 秒
// min 分鐘
// h 小時
// d 天
具體實現(注:Windows系統):
//gettime.h #ifndef GETTIME_H #define GETTIME_H #include<ctime> using namespace std; #define FUNCTION_CODE(func_sentence)\ clock_t start,finish;\ start=clock();\ func_sentence;\ finish=clock();\ LONGEST_FLOAT sec_divide=1e-3;\ if(unit=="ns") sec_divide=1e-9;\ else if(unit=="us") sec_divide=1e-6;\ else if(unit=="ms") sec_divide=1e-3;\ else if(unit=="s") sec_divide=1;\ else if(unit=="min") sec_divide=60;\ else if(unit=="h") sec_divide=3600;\ else if(unit=="d") sec_divide=86400;\ return double(finish-start)/CLOCKS_PER_SEC/sec_divide; typedef long double LONGEST_FLOAT; template<typename T> LONGEST_FLOAT gettime(T func,const char* unit="ms"){ // func's argument must be void FUNCTION_CODE(func()) } template<typename T,typename Taug1> LONGEST_FLOAT gettime(T func,Taug1 argument1,const char* unit="ms"){ //func's argument is (only one) FUNCTION_CODE(func(argument1)) } template<typename T,typename Taug1,typename Taug2> LONGEST_FLOAT gettime(T func,Taug1 argument1,Taug2 argument2,const char* unit="ms"){ //... FUNCTION_CODE(func(argument1,argument2)) } template<typename T,typename Taug1,typename Taug2,typename Taug3> LONGEST_FLOAT gettime(T func,Taug1 argument1,Taug2 argument2,Taug3 argument3,const char* unit="ms"){ FUNCTION_CODE(func(argument1,argument2,argument3)); } #endif
因為重複的程式碼太多了,所以我先把函式體定義成了一個巨集。
可以用這個函式測試cout的速度:
#include"E:\C++ h\gettime.h" // 這是我在計算機裡存的路徑,用的時候需要根據實際路徑替換 #include<iostream> #include<iomanip> using namespace std; int f(int a){ for(int i=0;i<a;i++) cout<<"1\b"; return a; } int main(){ long double mintime=1e+30,maxtime=0; cout<<" The 1:\n"; for(int i=0;;i++){ long double functime=gettime<int(*)(int)>(f,10000,"ms"); // 也可以不要尖括號和它裡面的內容 bool min_max=0; if(functime<mintime) mintime=functime,cout<<functime<<" *min\n",min_max=1; if(functime>maxtime) maxtime=functime,cout<<functime<<" *max\n",min_max=1; if(!min_max) cout<<functime<<"\n"; if(i%10==9){ cout<<"\t\tmin:"<<mintime<<" max:"<<maxtime<<"\n The "<<i/10+2<<":\n"; } } return 0; }