在编写时间密集型程序时,我们经常需要统计某些模块(或函数)的时间消耗。在以往实践中,这往往需要添加大量的测试代码,费时费力。正好我目前在公司开发的各类行情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(这还是比较简单的)。