Производительность кода C ++ - PullRequest
1 голос
/ 25 мая 2009

Когда речь идет о написании кода в C ++ с использованием VS2005, как вы можете измерить производительность вашего кода?

Для этого есть какой-либо инструмент по умолчанию в VS? Могу ли я узнать, какая функция или класс замедляют работу моего приложения?

Есть ли другие внешние инструменты, которые можно интегрировать в VS для измерения пробелов в моем коде?

Ответы [ 10 ]

4 голосов
/ 25 мая 2009

Если у вас есть выпуск Team System для Visual Studio 2005, вы можете использовать встроенный профилировщик.

4 голосов
/ 25 мая 2009

AMD CodeAnalyst предоставляется бесплатно как для Windows, так и для Linux и работает на большинстве процессоров x86 или x64 (включая Intel).

Он имеет дополнительные функции, доступные, когда у вас процессор AMD, конечно. Он также интегрируется в Visual Studio.

Мне очень повезло с этим.


Обратите внимание, что обычно существует как минимум две распространенные формы профилировщика:

  • инструменты : изменяет сборку для записи информации в начале и в конце определенных областей (обычно для каждой функции)
  • выборка : периодически проверяет, какой код выполняется для записи информации

Типы записываемой информации могут включать (но не ограничиваются): истекшее время, количество циклов ЦП, попадания / пропадания кэша и т. Д.

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

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

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

3 голосов
/ 25 мая 2009

Вы также можете использовать Intel VTune.

2 голосов
/ 25 мая 2009

Вы хотите инструмент под названием профилировщик. Для бесплатного, который покрывает самые простые случаи, я рекомендую Very Sleepy . Он работает путем выборки текущего стека вызовов приложения через равные промежутки времени.

1 голос
/ 26 мая 2009

Для навязчивых измерений используйте счетчики производительности. Поскольку вы используете C ++, вы должны использовать фасад поверх этого немного болезненного API. STLSoft имеет семейство таких вещей , с разными плюсами и минусами. Я предлагаю winstl::performance_counter для самого высокого разрешения или winstl::threadtimes_counter, если вы хотите отслеживать производительность определенного потока независимо от других действий в вашем процессе (ах). Несколько лет назад в «Докторе Доббе» была статья об этом, в которой было подробно описано обоснование дизайна фасадов.

Для неинтрузивного измерения нельзя пройти мимо VTune .

1 голос
/ 25 мая 2009

Я думаю, что измерение производительности и поиск кода для оптимизации - это разные проблемы и требуют разных методов.

Чтобы найти код для оптимизации, я клянусь этим простым методом , который ортогонален общепринятому мнению о профилировании и не требует от вас покупать или устанавливать какие-либо инструменты.

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

РЕДАКТИРОВАТЬ: Кстати, я только что посмотрел на Very Sleepy , и, похоже, на правильном пути. Он производит выборку всего стека вызовов и сохраняет каждый стек. Чего я не могу сказать, так это того, дает ли она для каждой инструкции вызова или обычной инструкции часть выборок стека, содержащих эту инструкцию. На мой взгляд, это самая ценная статистика, и она не должна быть очень точной.

dotTrace, с другой стороны, также выглядит так, что, возможно, он сохраняет выборки стека, но его представление информации стека вызовов в пользовательском интерфейсе выглядит как дерево вызовов. То, что я хотел бы найти, - это то, что показывает процент места в стеке отдельных инструкций (или операторов), потому что они могут находиться в разных ветвях дерева вызовов, и, таким образом, дерево вызовов может не учитывать их важность.

1 голос
/ 25 мая 2009

Вы всегда можете измерить время и производительность своего кода самостоятельно. Обратитесь к MSDN по поводу следующих функций QueryPerformanceCounter () и QueryPerformanceFrequency () .

Для более глубокого анализа распределения памяти и времени выполнения мы используем Memory Validator и Performance Validator из Software Verify . Они поддерживают несколько языков, кроме C ++.

0 голосов
/ 26 мая 2009

Мы получили хорошие результаты от AQTime . Это не бесплатно, но дешевле, чем Visual Studio; -)

0 голосов
/ 25 мая 2009

Я недавно пробовал JetBrains dotTrace profiler , и это выглядит очень хорошо. Это помогло мне легко найти несколько «черных дыр» в существующем коде C ++.

Он отлично работает в Visual Studio 2005 Professional в решении, которое смешивает C # и C ++ - он использует правильные имена функций для обоих фрагментов кода и выполняет интегрированный анализ. Вы можете отслеживать время или память.

Жаль, когда истечет период оценки :) 1009 *

0 голосов
/ 25 мая 2009

Мы используем Rational Quantify, который входит в состав Rational PurifyPlus набора инструментов.

Отличный инструмент для профилирования производительности приложений.

...