将执行时序代码放入OpenCV函数中?

时间:2014-10-31 14:43:09

标签: opencv timing function-calls

我有这个代码片段,我在我的程序(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);

我只关心通过函数调用的执行时间......也许我只是担心什么都没有!

1 个答案:

答案 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