如何在Zedboard上检查C ++程序中的时间性能

时间:2017-06-08 10:38:24

标签: c++ time fpga xilinx

我在Zedboard上实现了C ++代码。它编译和运行完美,但现在我想检查性能,以优化一些功能。 我已经检查了一些线程(Testing the performance of a C++ app)和这里(Timer function to provide time in nano seconds using C++),但我真的不明白如何应用它代码...

说清楚:我不擅长C ++,我从来没有真正学过这门语言,只是在特定的库中使用过几次。我甚至不是我正在使用的代码的作者(由教授给我)。

我的目标是在Zedboard上执行程序时检查每个功能和全局所花费的时间。代码在SD卡上的Linux映像上,电路板在此映像上启动。它使用opencv库来处理图像处理应用程序。我正在使用g ++ 4.6.3作为编译器。

提前感谢您的回答!

2 个答案:

答案 0 :(得分:0)

您可以使用<chrono>标头创建一个简单的计时器类。像这样:

class Timer
{
public:
    using clock = std::chrono::steady_clock;

    void clear() { start(); tse = tsb; }
    void start() { tsb = clock::now(); }
    void stop()  { tse = clock::now(); }

    auto nsecs() const
    {
        using namespace std::chrono;
        return duration_cast<nanoseconds>(tse - tsb).count();
    }

    double usecs() const { return double(nsecs()) / 1000.0; }
    double msecs() const { return double(nsecs()) / 1000000.0; }
    double  secs() const { return double(nsecs()) / 1000000000.0; }

    friend std::ostream& operator<<(std::ostream& o, Timer const& timer)
    {
        return o << timer.secs();
    }

private:
    clock::time_point tsb;
    clock::time_point tse;
};

您可以像这样使用它:

Timer timer;

timer.start();

// do some stuff
std::this_thread::sleep_for(std::chrono::milliseconds(600));

timer.stop();

std::cout << timer << " seconds" << '\n';

编辑:在POSIX系统上,如果clock_gettime()不可用,您可以使用<chrono>

class Timer
{
public:
    void clear() { start(); tse = tsb; }
    void start() { clock_gettime(CLOCK_MONOTONIC, &tsb); }
    void stop() { clock_gettime(CLOCK_MONOTONIC, &tse); }

    long nsecs() const
    {
        long b = (tsb.tv_sec * 1000000000) + tsb.tv_nsec;
        long e = (tse.tv_sec * 1000000000) + tse.tv_nsec;
        return e - b;
    }

    double usecs() const { return double(nsecs()) / 1000.0; }
    double msecs() const { return double(nsecs()) / 1000000.0; }
    double  secs() const { return double(nsecs()) / 1000000000.0; }

    friend std::ostream& operator<<(std::ostream& o, Timer const& timer)
    {
        return o << timer.secs();
    }

private:
    timespec tsb;
    timespec tse;
};

答案 1 :(得分:0)

我找到了一个令人不满意的解决方案,但我认为如果有任何帮助我仍然可以发布它。

我使用了gettimeofday()中定义的<time.h>函数。它使用起来非常简单但有缺陷我可以在后面解释:

timeval t1, t2;
gettimeofday(&t1, NULL);
/* some function */
gettimeofday(&t2, NULL);
double time;
time = (t2.tv_sec - t1.tv_sec)*1000.0 + (t2.tv_usec - t1.tv_usec)/1000.0; 
cout << time << "ms" << "\n";

这样我用毫秒测量时间并在屏幕上显示。但gettimeofday并非基于计算机时钟,而是基于实际时间。要清楚,2次调用之间经过的时间确实包含了我的函数,还包含了在Ubuntu后台运行的所有进程。换句话说,这并没有给我执行函数所花费的精确时间,但是值略高一些。

编辑:我使用clock()中的<time.h>函数再次找到了另一个解决方案,结果看起来与我之前使用的方法相比是正确的。不幸的是,精度是不够的,因为它只用3位数就能给出一个秒数。