Как проверить время исполнения в программе на С ++ на Zedboard

Я реализовал код C ++ на Zedboard. Он компилируется и работает отлично, но теперь я хотел бы проверить производительность, чтобы оптимизировать некоторые функции.
Я проверил некоторые темы здесь (Тестирование производительности приложения на C ++) и здесь (Функция таймера для предоставления времени в нано секундах с использованием C ++), но я не очень понимаю, как применить это Mon Mon …

Чтобы прояснить ситуацию: я не очень хорош в C ++, я никогда не изучал язык формально, а использовал его только несколько раз в определенных библиотеках. Я даже не автор кода, который я использую (данный мне профессорами).

Моя цель здесь состоит в том, чтобы проверить время, потраченное на каждую функцию и глобально, когда я выполняю программу на Zedboard. Код находится на образе Linux на SD-карте, плата загружается на этом образе. Он использует библиотеку opencv для приложения обработки изображений. Я использую G ++ 4.6.3 в качестве компилятора.

Заранее спасибо за ваш ответ!

1

Решение

Вы можете создать простой класс таймера, используя <chrono> заголовок. Что-то вроде этого:

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

void clear() { start(); tse = tsb; }
void start() { tsb = std::chrono::steady_clock::now(); }
void stop()  { tse = std::chrono::steady_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;
};
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 основывается не на часах компьютера, а на фактическом времени. Чтобы было ясно, время, прошедшее между двумя вызовами, действительно содержит мою функцию, а также все процессы, выполняющиеся в фоновом режиме в Ubuntu. Другими словами, это не дает мне точное время, затраченное моей функцией на выполнение, но немного выше.

РЕДАКТИРОВАТЬ: я снова нашел другое решение, используя clock() функция от <time.h> и результат кажется правильным по сравнению с теми, что я получаю с предыдущим методом. К сожалению, точность не достаточна, так как она дает число в секундах только с 3 цифрами.

0

По вопросам рекламы [email protected]