跨平台的模块时间统计套件(C++编写)

来源:互联网 发布:淘宝淘金币半币抢购 编辑:程序博客网 时间:2024/06/05 07:36

在编写时间密集型程序时,我们经常需要统计某些模块(或函数)的时间消耗。在以往实践中,这往往需要添加大量的测试代码,费时费力。正好我目前在公司开发的各类行情FeedHandler恰好也是时间密集型程序,也常常需要测试模块的时间消耗,因此我开发了一个小套件,极大简化了程序各模块的时间统计。

套件开源,可至http://download.csdn.net/detail/great3779/4139994免费下载使用。

首先通过Demo看看套件运行的效果:

Demo代码如下:

#include "stdafx.h"#include <Windows.h>// just include for testing demo.#include "TimerKitWrapper.h"#include <sstream>using namespace std;void test(int i){stringstream ss;//ss << __FUNCTION__ << "_" << i;ss << "test" << "_" << i;TUnit tu(ss.str());RegisterUnit(tu);Sleep(100);}int _tmain(int argc, _TCHAR* argv[]){// 主线程中定义一个TKit对象即可TKit tk;TUnit tu("_tmain");RegisterUnit(tu);{// 模块中定义一个测时单件并注册// function为待测时模块名,windows下可用__FUNCTION__获取函数名TUnit tu("function");// 注册至测时套件RegisterUnit(tu);Sleep(400);}for(int i = 0; i < 3; ++i){test(i);}return 0;}

Demo运行效果如下:



从Demo程序可以看出,测时套件的使用非常简单:仅需在主线程中定义一个TKit对象,然后在需要统计时间的模块内注册TUnit测时单件即可。

待程序运行结束后,会在最后输出各模块的统计时间。使用方便,显示明快!


几点说明:

1. 计时精度精确到毫秒级(多数情况下够用了)。

2. 示例套件仅采用了控制台的结果输出方式,感兴趣的朋友可以扩展为其他输出方式(例如文件, xml等)

3. 套件线程安全。不过如果在多线程中同时注册名称完全相同的测试单件,则套件运行结果未定义(但不会崩溃)。

当然,也可以对CTimerKit::AddTime加互斥保护消除未定义的结果,有兴趣的朋友可以试试。

4. 添加了两个外壳类CTimerKitWrapper和CTimerUnitWrapper是为了隐藏代码的实现细节,以便将套件封装成dll形式。

有兴趣的朋友可以将其封装成dll(这还是比较简单的)。