Подтвердить что ты не робот

С# Как определить, где находятся медленные части моего кода?

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

Спасибо

4b9b3361

Ответ 1

ОК, время downvote...

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

Но ваш вопрос: "Как определить, где находятся медленные части моего кода?".

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

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

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

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

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

Сделайте это несколько раз.

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

В коде вы можете сделать это очень простым способом: "Пауза" и спросите его, почему он проводит этот конкретный цикл. Обычно стек вызовов сообщает вам, почему, подробно.

Сделайте это несколько раз.

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

ЦЕНА НЕБРЕЖНАЯ, когда вы сравниваете ее с количеством часов, которые она сможет сэкономить.

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

Ответ 9

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

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

Ответ 10

Еще одним вариантом является Intel VTune.