C # Как я могу определить, где медленные части моего кода? - PullRequest
15 голосов
/ 28 января 2009

Я не буду долго кодировать, поэтому я не знаю, какой метод является самым быстрым, поэтому мне было интересно, есть ли способ сделать это в VS или с помощью стороннего инструмента?

Спасибо

Ответы [ 11 ]

17 голосов
/ 26 февраля 2009

ОК, время понижения ...

Профилировщики отлично подходят для измерения.

Но ваш вопрос был «Как я могу определить, где медленные части моего кода?».

Это другая проблема. Это диагноз, а не измерение.

Я знаю, что это не популярный взгляд, но это правда.

Это похоже на бизнес, который пытается сократить расходы.

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

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

Делайте это более одного раза.

Именно так Гарри Трумэн сделал во время Второй мировой войны в оборонной промышленности США и сразу же обнаружил массовые мошенничества и растраты, посетив несколько объектов. Это диагноз.

В коде вы можете сделать это очень простым способом: «приостановить» его и спросить, почему он тратит именно этот цикл. Обычно стек вызовов подробно объясняет почему.

Делайте это более одного раза.

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

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

Чтобы ответить на ваш вопрос:

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

ДОБАВЛЕНО: RedGate ANTS становится там. Это может дать вам стоимость за линию, и это довольно элегантно. Так что, если вы находитесь в .NET и можете сэкономить 3 цифры, и вы не против подождать, чтобы установить и изучить его, он может рассказать вам многое из того, что может сказать вам ваша клавиша Pause, и проявить гораздо большую симпатию.

9 голосов
/ 28 января 2009

профилирование.

RedGate имеет продукт.
JetBrains имеет продукт.

2 голосов
/ 26 февраля 2009

Eqatec profiler - это симпатичный маленький профилировщик, который бесплатен и прост в использовании. Вероятно, он не приблизится к «вау» фактору профилировщика Ants с точки зрения возможностей, но все же это очень крутая IMO и стоит посмотреть.

2 голосов
/ 16 февраля 2009

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

Прежде всего, я взял интервью у пользователей и сам работал над вариантами использования, чтобы составить список целевых вариантов использования, которые выделили области, которые хуже функционируют в системах. То есть Я не хотел тратить n человеко-дней на оптимизацию функции, которая почти никогда не использовалась, но очень медленная. Однако я бы хотел потратить время на оптимизацию функции, которая была немного вялой, но вызывалась 1000 раз в день и т. Д.

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

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

Мы также профилировали сервер и пользовательский интерфейс и смогли определить распределение времени, проведенного в пользовательском интерфейсе, времени, проведенного на проводе, времени, проведенного на сервере и т. Д.

Также стоит отметить, что 1 пробега недостаточно, а 1 пробежку обычно стоит выбросить. Позвольте мне объяснить: нагрузка на ПК, сетевой трафик, состояние JIT-компиляции и т. Д. Могут влиять на время, которое займет определенная операция. Простая стратегия состоит в том, чтобы измерить операцию n раз (скажем, 5), отбросить самый медленный и самый быстрый прогон, проанализировать профили ремианирования.

2 голосов
/ 16 февраля 2009

Я использовал ANTS Profiler и могу присоединиться к другим с рекомендациями.

Цена НЕ УКАЗАНА, если сравнить ее с количеством часов разработки, которые вас спасут.

Я разработчик для заработка, и ваша компания не купит его для вас, либо сменит компанию, либо купит ее для себя.

1 голос
/ 28 января 2009

Используйте профилировщик . ANTS стоит денег, но очень приятно.

0 голосов
/ 12 апреля 2018

Я просто установил точки останова, Visual покажет вам, сколько мс между точкой останова прошло. так что вы можете найти его вручную.

0 голосов
/ 16 февраля 2009

Еще один вариант - Intel VTune .

0 голосов
/ 28 января 2009

Если вы не хотите платить, новые версии VS поставляются с профилировщиком, но, честно говоря, это не очень хорошо. ATI / AMD делают бесплатный профилировщик ... но он не очень удобен для пользователя (для меня, я не мог получить какую-либо полезную информацию из этого).

Совет, который я бы дал, заключается в том, чтобы функция time вызывала себя с помощью кода. Если они быстрые, и у вас нет высокоточного таймера, или по разным причинам (например, при каждом вызове x создается какой-либо кэш) скорость вызовов меняется, попробуйте выполнить каждый из них x10000 раз или около того, а затем разделить результат соответственно. Это может не быть идеальным для некоторых разделов кода, но если вы не можете найти хорошее, бесплатное, стороннее решение, это почти то, что осталось, если вы не хотите платить.

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