Поиск по сайту:

Как отлаживать производительность вашего приложения


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

Какие проблемы искать

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

Каждая программа уникальна, но многие приложения будут страдать от множества одних и тех же проблем:

  • Функции вызываются слишком часто (кэширование или планирование могут сократить количество вызовов).
  • Код блокировки ввода-вывода, обычно синхронный доступ к диску, но также и чрезмерное использование памяти.
  • Большие циклы с дорогостоящими методами.
  • Долгое время запуска, особенно в языках, компилируемых JIT.
  • Ненужное выделение памяти, особенно во время выполнения со сборщиком мусора.
  • Области, которые выиграют от параллелизма или асинхронного программирования.

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

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

Как работает профилирование?

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

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

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

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

Многие IDE также будут иметь инструменты профилирования, встроенные поверх стандартного набора инструментов отладки, которые вы также можете использовать. Visual Studio, например, может профилировать производительность и использование памяти во многих приложениях.

  • Java — JProfiler, интегрированные среды разработки IDEA/Eclipse/Netbeans
  • Python — cProfiler, Palanteer
  • JavaScript — инструменты разработчика Chrome
  • C# — dotTrace, Visual Studio IDE
  • C, C++ – Орбита 

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

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

Использование профилировщика производительности

В этом руководстве мы покажем, как использовать dotTrace — полнофункциональный профилировщик производительности для приложений .NET, в котором есть большинство инструментов других профилировщиков. Если вы не профилируете код C#, вы, вероятно, будете использовать другое приложение, но общий процесс должен быть аналогичным.

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

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

Как только он откроется, вы увидите множество графиков рядом со стеком вызовов и деревом вызовов, которые, вероятно, выглядят нечитаемыми. Если вы видите много вещей, связанных с потоками, блокировками и ожиданием, это, вероятно, потому, что вам нужно охватить «основной поток».

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

dotTrace также имеет функцию фильтрации кода в зависимости от области его работы, используя фильтры «Подсистемы» слева. Системный код, собственный код и другие запаздывающие области, такие как отражение, коллекции, строки и LINQ, можно искать.

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

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

Время ЦП, затрачиваемое на функции, не всегда является проблемой, особенно для такого языка, как C# со сборщиком мусора. dotTrace также отслеживает использование и распределение памяти и может быть использован для определения того, что оказывает ненужную нагрузку на ваш GC.