最常用的执行时间测试方法,利用clock函数,精确度能达到ms级。
直接看代码吧,这样最直观:
#include "stdafx.h"
#include <ctime>
#include <vector>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]){
clock_t start,finish;
long i = 100000L;
double duration;
vector<long> v1;
start = clock();
for (;i>0;i--){
v1.push_back(i*(i%3));
}
finish = clock();
duration = (double)(finish - start)/CLOCKS_PER_SEC;
cout<< duration << endl;
system("pause");
return 0;
}
其中,#define CLOCKS_PER_SEC 1000不同平台可能不一样,它用来表示一秒钟会有多少个时钟计时单元,clock()是以毫秒为单位,要正确输出时间差需要把它换成秒,因此需要除以CLOCKS_PER_SEC。clock()函数计算出来的是硬件滴答的数目,不是毫秒。在TC2.0中硬件每18.2个滴答是一秒,在VC++6.0中硬件每1000个滴答是一秒。
可以说是最高精度测试方法,但是它针对于特定的平台测试,利用QueryPerformanceFrequency和QueryPerformanceCounter函数,精确度能达到ns级。
先看代码:
#include "windows.h"
#include <vector>
#include <iostream>
using namespace std;
int main(int argc,char *argv[]){
LARGE_INTEGER frequency, start, finish;
long i = 100000L;
vector<long> v1;
// 获取计数器的时钟频率
QueryPerformanceFrequency(&frequency);
// 开始的计数
QueryPerformanceCounter(&start);
for (;i>0;i--){
v1.push_back(i*(i%3));
}
//Sleep(3000); // 也可以测试睡眠1000毫秒
//结束的计数
QueryPerformanceCounter(&finish);
cout<<(double)(finish.QuadPart-start.QuadPart)/frequency.QuadPart<<endl;
system("pause");
return 0;
}
QueryPerformanceFrequency和QueryPerformanceCounter()一起计算出精确时间。QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率,QueryPerformanceCounter()函数用于得到高精度计时器的值(如果存在这样的计时器),如果不支持返回值为0。
LARGE_INTEGER结构实际上是一个联合。如果你的编译器具有内置支持64位整数,使用QuadPart成员中存储的64位整数。否则,使用LowPart和HighPart成员的存储的64位整数。
LARGE_INTEGER结构
#if defined(MIDL_PASS)
typedef struct _LARGE_INTEGER {
#else // MIDL_PASS
typedef union _LARGE_INTEGER {
struct {
DWORD LowPart;
LONG HighPart;
} DUMMYSTRUCTNAME;
struct {
DWORD LowPart;
LONG HighPart;
} u;
#endif //MIDL_PASS
LONGLONG QuadPart;
} LARGE_INTEGER;
LARGE_INTEGER成员:
LowPart 低32位。
HighPart 高32位。
QuadPart 有符号的64位整数。
最后,上面的时间单位都是秒,我们其实可以将其转换成更小的单位,比如(double)(finish - start)*1000,是毫秒。(double)(finish - start)*1000000,是微妙。(double)(finish - start)*1000 000 000,是纳秒。有兴趣的可以试验下,其实两种方法测试的结果有偏差,原因就看读者怎么看了。
原文地址:http://blog.csdn.net/z702143700/article/details/46278993