Как я могу профилировать код C ++, работающий в Linux? - PullRequest
1645 голосов
/ 17 декабря 2008

У меня есть приложение C ++, работающее под Linux, которое я сейчас оптимизирую. Как я могу определить, какие области моего кода работают медленно?

Ответы [ 14 ]

2 голосов
/ 15 сентября 2018

Также стоит упомянуть,

  1. HPCToolkit (http://hpctoolkit.org/) - с открытым исходным кодом, работает для параллельных программ и имеет графический интерфейс для просмотра результатов несколькими способами
  2. Intel VTune (https://software.intel.com/en-us/vtune) - если у вас есть компиляторы Intel, это очень хорошо
  3. TAU (http://www.cs.uoregon.edu/research/tau/home.php)

Я использовал HPCToolkit и VTune, и они очень эффективны при поиске длинного полюса в палатке и не требуют перекомпиляции вашего кода (за исключением того, что вы должны использовать сборку типа -g -O или RelWithDebInfo в CMake для значимый вывод). Я слышал, что TAU схожи по своим возможностям.

1 голос
/ 24 февраля 2019

Вы можете использовать библиотеку iprof:

https://gitlab.com/Neurochrom/iprof

https://github.com/Neurochrom/iprof

Он кроссплатформенный и позволяет вам не измерять производительность вашего приложения также в режиме реального времени. Вы даже можете связать это с живым графиком. Полный отказ от ответственности: я автор.

0 голосов
/ 21 мая 2019

Вы можете использовать каркас журналирования, например loguru, поскольку он включает метки времени и общее время безотказной работы, которые можно использовать для профилирования:

0 голосов
/ 17 мая 2019

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

Это на C ++ и должно быть настроено в соответствии с вашими потребностями. К сожалению, я не могу поделиться кодом, только понятиями. Вы используете «большой» volatile буфер, содержащий метки времени и идентификатор события, которые вы можете выгрузить после вскрытия или после остановки системы журналирования (и, например, сбросить ее в файл).

Вы получаете так называемый большой буфер со всеми данными, а небольшой интерфейс анализирует его и показывает события с именем (вверх / вниз + значение), как осциллограф с цветами (настроенный в файле .hpp).

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

Вам нужно 3 файла:

toolname.hpp // interface
toolname.cpp // code
tool_events_id.hpp // Events ID

Концепция состоит в том, чтобы определять события в tool_events_id.hpp следующим образом:

// EVENT_NAME                         ID      BEGIN_END BG_COLOR NAME
#define SOCK_PDU_RECV_D               0x0301  //@D00301 BGEEAAAA # TX_PDU_Recv
#define SOCK_PDU_RECV_F               0x0302  //@F00301 BGEEAAAA # TX_PDU_Recv

Вы также определяете несколько функций в toolname.hpp:

#define LOG_LEVEL_ERROR 0
#define LOG_LEVEL_WARN 1
// ...

void init(void);
void probe(id,payload);
// etc

В любом месте кода вы можете использовать:

toolname<LOG_LEVEL>::log(EVENT_NAME,VALUE);

Функция probe использует несколько сборочных строк для извлечения метки времени часов КАК МОЖНО СКОРЕЕ, а затем устанавливает запись в буфере. У нас также есть атомарный инкремент для безопасного поиска индекса, в котором будет храниться событие журнала. Конечно, буфер является круглым.

Надеюсь, что идея не запутана отсутствием примера кода.

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