1. 程式人生 > >C++實現測試函式執行時間函式

C++實現測試函式執行時間函式

使用方法:

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