分析工具并不神奇,您可以在几行内为任何目的推出自己的产品。
事情是这样的,也许:
// code profile.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
class cProfile
{
public:
// construct profiler for a particular scope
// call at begining of scope to be timed
// pass unique name of scope
cProfile(const char* name)
{
myName = string(name);
QueryPerformanceCounter((LARGE_INTEGER *)&myTimeStart);
}
// destructor - automatically called when scope ends
~cProfile();
// constructor - produces report when called without parameters
cProfile();
private:
typedef accumulator_set<__int64, stats<tag::variance(lazy)> > acc_t;
static map < string, acc_t > myMap;
string myName;
__int64 myTimeStart;
};
map < string, accumulator_set<__int64, stats<tag::variance(lazy)> > > cProfile::myMap;
cProfile::~cProfile()
{
__int64 t=0;
QueryPerformanceCounter((LARGE_INTEGER *)&t);
t -= myTimeStart;
map < string, acc_t >::iterator p = myMap.find(myName);
if(p == myMap.end()) {
// this is the first time this scope has run
acc_t acc;
pair<string,acc_t > pr(myName,acc);
p = myMap.insert(pr).first;
}
// add the time of running to the accumulator for this scope
(p->second)(t);
}
// Generate profile report
cProfile::cProfile()
{
__int64 f;
QueryPerformanceFrequency((LARGE_INTEGER *)&f);
printf("%20s Calls\tMean (secs)\tStdDev\n","Scope");
for(map < string, accumulator_set<__int64, stats<tag::variance(lazy)> > >::iterator p = myMap.begin();
p != myMap.end(); p++)
{
float av = mean(p->second)/f;
float stdev = sqrt(((double) variance(p->second)) )/f;
printf("%20s %d\t%f\t%f\n",p->first.c_str(),
boost::accumulators::count(p->second), av, stdev);
}
}
void a()
{
cProfile profile("a");
Sleep (rand() % 10 + 10);
}
void b()
{
cProfile profile("b");
Sleep (rand() % 20 + 5);
}
int _tmain(int argc, _TCHAR* argv[])
{
for (int k=1;k<=100;k++) {
a();
b();
}
cProfile profile_report;
return 0;
}
将会产生
Scope Calls Mean (secs) StdDev
a 100 0.014928 0.002827
b 100 0.015254 0.005671
它是否必须是自动的?只需写一些宏,并在表格中写下结果,然后就可以计算出你想要的结果。 – Makis 2009-07-03 12:19:22