Измерение общего процессорного времени программы, которая использует предварительно скомпилированные библиотеки (C ++, Linux) - PullRequest
0 голосов
/ 20 октября 2010

Я в настоящее время сталкиваюсь с этой проблемой, и я хотел бы услышать некоторые предложения от вас.

У меня есть программа на C ++, которая использует предварительно скомпилированную библиотеку для выполнения некоторых запросов к базе данных PostgreSQL. Теперь проблема состоит в том, что я хочу узнать общее (комбинированное) время процессора, необходимое для выполнения всех процедур, описанных в исходном коде программы и , а также время, которое он тратит на ожидание действий, связанных с базой данных.

Я использовал команду time в Linux, но, похоже, она не измеряла время, затраченное программой на базу данных.

И в моей ситуации я не смогу перекомпилировать предоставленную мне библиотеку, поэтому я не думаю, что такие вещи, как gprof будут работать.

Есть предложения?

Спасибо.

Ответы [ 4 ]

1 голос
/ 20 октября 2010

Используйте POSIX раз , он измеряет реальное, пользовательское и системное время процесса и его потомков.

На связанной странице Opengroup есть пример: «Время поиска в базе данных»

1 голос
/ 20 октября 2010

Попробуйте функцию часов в ctime.

<code>clock_t start, end;
double cpu_time_used</p>

<p>start = clock();
// Do stuff
end = clock();
cpu_time_used = ((double)(end - start)) / CLOCKS_PER_SEC;
0 голосов
/ 21 октября 2010

Вы можете включить log_statement и log_duration и установить log_min_duration_statement=0 в postgresql.conf, запустить вашу программу и затем проанализировать журналы Postgres, используя, например, PQA .

0 голосов
/ 20 октября 2010

Конечно, вы все равно получите время настенных часов, но, вероятно, вы пытаетесь получить время процессора.

Это нетривиально, если задействованы подпроцессы (или не связанные процессы). Однако вы можете попытаться использовать более целостный подход к сравнительному анализу.

Измерение задержки приложения достаточно просто (просто посмотрите на настенные часы), но пропускная способность, как правило, сложнее.

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

Обычно это означает одновременное выполнение множества задач, так как современное оборудование может выполнять несколько задач одновременно. Более того, если что-то в вашем приложении когда-либо ожидает какого-либо внешнего источника данных (включая, возможно, жесткий диск вашей собственной машины), вы можете получить лучшую пропускную способность даже на одном ядре, обслуживая несколько запросов одновременно.

Возможно, вы захотите взглянуть на такие инструменты, как oprofile, который предназначен для профилирования, а не для бенчмаркинга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...