码迷,mamicode.com
首页 > 编程语言 > 详细

高效编程——C++测试代码运行时间方法

时间:2015-05-31 09:25:08      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:c++测试函数效率   运行时间测试   测试时间   

C++测试代码运行时间方法

方法一

最常用的执行时间测试方法,利用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,是纳秒。有兴趣的可以试验下,其实两种方法测试的结果有偏差,原因就看读者怎么看了。

高效编程——C++测试代码运行时间方法

标签:c++测试函数效率   运行时间测试   测试时间   

原文地址:http://blog.csdn.net/z702143700/article/details/46278993

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!