我有这个代码片段,我在我的程序(C ++和OpenCV)中随处可见。它用于计时某些操作:
double t;
// Some code...
t = (double)getTickCount();
Object1.LotOfComputing();
t = 1000*((double)getTickCount() - t)/getTickFrequency();
cout << "Time for LotOfComputing =" << t << " milliseconds."<< endl;
cout << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=" << endl;
这就是OpenCV doc建议对代码的功能/部分进行计时的方式,它在使用几周后似乎对我有用。我测量的时间从大约1毫秒到700毫秒,我将它们舍入到毫秒。
问题在于我在程序中对很多不同的操作进行了计时,这些代码片段使代码混乱。
我想知道将这些代码行放入函数是否明智,例如:
double timing(double time){
timing = 1000*((double)getTickCount() - time)/getTickFrequency();
cout << "Time for LotOfComputing =" << timing << " milliseconds."<< endl;
cout << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=" << endl;
return timing;
}
所以我可以使用它:
double t;
// Some code...
t = (double)getTickCount();
Object1.LotOfComputing();
timing(t);
我只关心通过函数调用的执行时间......也许我只是担心什么都没有!
答案 0 :(得分:6)
基本上,它为每个范围创建静态计数器(想象一对{}),它在模块启动时初始化,并在模块发布时读出。当然这也需要时间,所以你不要在一个紧密的循环内部。
// you might want to change the clock
#define get_ticks cv::getTickCount
#define get_freq cv::getTickFrequency
double dt(int64 t) { return double(t*1000/get_freq())/1000.0; }
struct Profile
{
string name;
int64 t; // accumulated time
int64 c; // function calls
Profile(const string & name)
: name(name)
, t(0)
, c(0)
{}
~Profile()
{
cerr << format("%-24s %8u ",name.c_str(),c);
cerr << format("%13.6f ",dt(t/c));
cerr << format("%13.6f ",dt(t));
cerr << format("%14u",t);
cerr << endl;
}
struct Scope
{
Profile & p;
int64 t;
Scope(Profile & p)
: p(p)
, t(get_ticks())
{}
~Scope()
{
int64 t1 = get_ticks();
if ( t1 > t )
{
p.t += t1 - t;
p.c ++;
}
}
};
};
#define PROFILEX(s) static Profile _a_rose(s); Profile::Scope _is_a_rose_is(_a_rose);
#define PROFILE PROFILEX(__FUNCTION__)
void foo() {
PROFILE;
int k=10;
while (k) {
PROFILEX("foo while loop");
k --;
}
}
void bar() {
PROFILE;
}
int main() {
PROFILE;
{
PROFILEX("useless scope");
bar();
bar();
}
foo();
return 0;
}
foo while loop 10 0.000000 0.000002 3959
foo 1 0.000007 0.000007 13000
bar 2 0.000000 0.000000 843
useless scope 1 0.000004 0.000004 7710
main 1 0.000017 0.000017 31712