Можно ли использовать GDB или другой инструмент для обнаружения частей сложной программы (например, циклов), для оптимизации таргетинга которых требуется больше времени, чем ожидалось? - PullRequest
0 голосов
/ 13 ноября 2010

Как видно из названия: скажем, у нас сложная программа, и мы хотим сделать ее как можно быстрее.Можем ли мы как-то определить, какие циклы или другие части его структуры занимают большую часть времени для их нацеливания на оптимизацию?

edit: Обратите внимание, важно то, что программное обеспечение считается очень сложным, и мы не можемпроверять каждый цикл или другую структуру по очереди, помещая в них таймеры и т. д.

Ответы [ 3 ]

5 голосов
/ 13 ноября 2010

Вы ищете профилировщик. Есть несколько вокруг; поскольку вы упоминаете gcc, вы можете проверить gprof (часть binutils). Есть также Google Perf Tools , хотя я никогда не использовал их.

3 голосов
/ 13 ноября 2010

Для этого вы можете использовать GDB, этим методом .

Ниже приведен пример его использования для оптимизации реально сложной программы.

Вы можете найти «горячие точки», которые вы можете оптимизировать, но больше как правило, вещи, которые дают вам наибольшую возможность сэкономить время, - это вызовы функций среднего уровня, которых вы можете избежать.

  1. Одним из примеров, скажем, является вызов функции для извлечения информации из базы данных, где функция вызывается несколько раз, когда при некотором дополнительном кодировании можно использовать результат предыдущего вызова. Часто такие звонки невелики и выглядят невинно, и вы удивляетесь, узнав, сколько они стоят, в общем проценте времени.

  2. Другой пример - выполнение низкоуровневого ввода-вывода, который ускользает от внимания, но на самом деле стоит немалых процентов времени.

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

Еще одним хорошим инструментом для поиска этих проблем является Zoom .

Вот обсуждение технических вопросов , но в основном то, что нужно искать, это:

  • Он должен сообщать вам включительно процентов времени, при разрешении на уровне линии , а не только функции. а) Только знание того, что функция является дорогостоящей, заставляет задуматься, где в ней находятся строки, на которые вам следует обратить внимание. б) Инклюзивный процент говорит об истинной стоимости линии - сколько итогового времени она несет и не потратила бы, если бы ее не было.

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

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

2 голосов
/ 13 ноября 2010

gprof разбивает его по функциям.Если у вас много разных циклов в одной функции, она может не сказать вам, какой цикл занимает время.Это ключ к рефакторингу; -)

...