Вопрос

Я пытаюсь настроить производительность моего приложения.И мне любопытно, какие методы требуют больше всего времени для обработки и поэтому следует искать возможности оптимизации.

Существуют ли какие-либо бесплатные инструменты, которые помогут мне визуализировать стек вызовов и сколько времени занимает выполнение каждого метода?Я думаю о чем-то, что отображает стек вызовов в виде гистограммы с накоплением или древовидная карта так что это легко увидеть МетодА() завершение заняло 10 секунд, потому что он вызывал МетодБ() и Метод(С) на это ушло 3 и 7 секунд.

Существует ли что-то подобное?

Это было полезно?

Решение

Да, они называются профилировщиками производительности. Ознакомьтесь с RedGate ANTS и JetBrains 'dotTrace, не бесплатным, но довольно дешевым и намного лучше, чем любая бесплатная альтернатива, которую я видел.

Другие советы

Доступны несколько профилировщиков. Я знаком только с одним (который входит в Visual Studio Team Suite), но это не бесплатно. Должен сказать, что он был достаточно мощным / надежным, и у меня не было желания переключаться на другое. Другой, о котором я слышал, - это .NET-профилировщик Red Gate (тоже не бесплатный). Оба из них имеют наборы функций, включая, но не ограничиваясь, что вы ищете. Если это для разработки коммерческих приложений, обязательно проверьте их. :)

Это измеряется либо с помощью приборов, либо с помощью выборки внутри профилировщика.

Инструментарий

Инструментирование грубо эквивалентно переписыванию всего вашего кода, чтобы сделать следующее:

public void Foo()
{
   //Code
}

в

public void Foo()
{
   InformTheProfilingCodeThatFooStarted();
   //Code
   InformTheProfilingCodeThatFooEnded();
}

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

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

Выборка

Альтернативный подход — выборка.

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

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

Я знаю только один бесплатный профилировщик выборки для кода .net — бесплатный распространяемый профилировщик, связанный с выпуском VS 2008 Team System (но его можно загрузить отдельно).Полученный результат невозможно просмотреть с помощью чего-либо, кроме (очень дорогой) версии Visual Studio Team System.

Red Gate ANTS не поддерживает выборку (в настоящее время), Jet Brains (dotTrace) и MS Visual Studio Team System имеют профилировщики, поддерживающие оба стиля.Что вы предпочитаете с точки зрения затрат и выгод – это вопрос вашего мнения.

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

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

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

КСТАТИ:Эта техника малоизвестна главным образом потому, что профессора ей не учат (даже если они ее знают), потому что им редко приходится работать с чудовищным программным обеспечением, как у нас в реальном мире, поэтому они лечат gprof в качестве базовой парадигмы профилирования.

Вот пример его использования.

P.S.Ожидайте, что в сумме проценты составят намного больше 100%.Проценты можно представить так: если оператор или подпрограмма находится в стеке X% времени (по оценкам на основе небольшого количества выборок), то это примерно соответствует тому, насколько сократится время настенных часов, если оператор или подпрограмма можно сделать так, чтобы это занимало гораздо меньше времени.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top