Как интерпретировать вывод gprof - PullRequest
2 голосов
/ 02 октября 2011

Я только что профилировал свою программу с помощью gprof и получил это:

100.01      0.01     0.01    23118     0.43     0.43  std::vector<int, std::allocator<int> >::operator=(std::vector<int, std::allocator<int> > const&)

Что меня смущает, так как говорит, что он использует 100,01% времени с помощью оператора =.Правильно ли я догадываюсь, что это означает, что это просто копирование данных все время и есть ли предел того, сколько памяти разрешено использовать программе?

1 Ответ

11 голосов
/ 02 октября 2011

Похоже, что вы профилировали слишком мало, чтобы получить какие-либо полезные данные.

Способ работы gprof заключается в том, что он периодически прерывает ваш код, чтобы увидеть, в какой функции вы работали в этот момент. Если код выполняется не очень долго, он может собирать только небольшое количество точек данных. Напротив, callgrind обрабатывает ваш код и отслеживает каждый вызов и возврат функции и проверяет, сколько времени было потрачено между перехватчиками. Это дает гораздо более полное представление, даже если пробег короткий. У этого есть недостаток, это немного замедляет программу.

Другое преимущество callgrind заключается в том, что вы можете остановить, запустить и сохранить сбор данных. Поэтому, если вы не хотите следить за запуском вашей программы или хотите отлавливать только время, которое она выполняет, вы можете это сделать. Кроме того, есть инструмент под названием kcachegrind, который может предоставить вам прекрасное графическое представление собранных данных.

Если вы можете терпеть замедление вашей программы в четыре раза во время ее запуска для тестирования, используйте вместо нее callgrind - это часть valgrind.

Если вы используете Linux, ваш дистрибутив, вероятно, имеет пакет valgrind и пакет, включающий kcachegrind (который может называться kdesdk или что-то еще). Стоит потратить время на изучение того, как их использовать (с ними не так легко начать, как с gprof). Я думаю, вы найдете впечатляющий графический интерфейс пользователя kcachegrind (посмотрите на этот снимок экрана ). И, как следует из названия, он может анализировать cachegrind вывод.

...