2010-10-16 2 views
3

Все,подход узкие места в коде

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

+1

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

+0

Пожалуйста, укажите ОС, архитектуру, язык программирования и т. Д. –

+1

@Paul: языком программирования Hmm будет Java. Я не уверен, зачем ставить вопрос OS или архитектуре. Учитывая любой код, какими должны быть этапы, является мой основной вопрос. –

ответ

2

Я предполагаю, что у вас есть исходный код, и вы можете запускать его под отладчиком и что есть кнопка «пауза» (или Ctrl-C или Esc), с помощью которой вы можете просто остановить ее на своих дорожках ,

Я делаю это несколько раз, пока он заставляет меня ждать, как 10 или 20, и каждый раз изучать стек вызовов и, возможно, какую-то другую информацию о состоянии, поэтому я могу дать вербальное объяснение того, что он делает и почему.

Это важная вещь - знать почему это делает то, что он делает.

Обычно я вижу, что, скажем, 20% или 50% или 90% образцов, он что-то делает, и часто эта вещь может быть выполнена более эффективно или вообще не выполняется. Таким образом, исправление этой вещи сокращает время выполнения (примерно) этого процента. Чем больше проблема, тем быстрее вы ее видите. В пределе вы можете диагностировать бесконечный цикл в 1 образце.

Это получает много флака от профилирующих поклонников, но люди, которые его пробуют, знают, что это работает очень хорошо. Он основан на разных предположениях. Если вы ищете слона в комнате, вам не нужно его измерять. Вот more detailed explanation и list of common myths.

Следующая лучшая вещь должна была бы стена времени стек пробоотборник, сообщающий процентов на линии или инструкции уровня, такие как Zoom или LTProf, но они все еще оставляют вас озадачивает вне почему.

Удачи.

+0

+1 - Я считаю, что это почти всегда лучший способ выполнить первоначальную настройку производительности. –

+0

@Rex: Tx. Если есть асинхронный протокол, или очередь сообщений, он должен переключать методы в какой-то момент. В противном случае этот метод переносит меня до конца, из-за «эффекта увеличения». Это где, если есть серия «узких мест», стоимость которых составляет, скажем, 50%, 25% и 12,5%, удаление наибольших удваивает стоимость и очевидность остальных –

2

Вы должны использовать профилирование тоже зависит от платформы:

  • .NET: инструменты Визуальное Performance Studio, JetBrains dotTrace
  • Java: JProfiler

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

Как подойти к проблеме в значительной степени зависит от типа программы и проблемы производительности, с которой вы сталкиваетесь. Но в принципе, вы будете повторить следующий цикл:

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

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

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

+0

Возможно, вы намеревались напечатать JetBrains dotTrace; ReSharper не является их инструментом профилирования. – Cumbayah

+0

Верно, извините. Я думал, что dotTrace, не знаю, почему я набрал это! Вероятно, потому, что я очень люблю ReSharper! – Iravanchi

+0

Для скомпилированного кода используйте Zoom или oprofile в Linux, Shark в Mac OS X, VTune на Windows. –

0

Не имея представления о такой системе вы работаете, эти части безвозмездного совет:

  • Try, чтобы накопить знания о том, как система масштабах: как в 10 раз больше пользователей обрабатываемые, как он справляется со 100 раз больше данных или со 100-кратной более медленной сетевой средой ...

  • Найти правильные «зондирующие» точки в системе: распределенная система, конечно, сложнее анализировать, чем настольное приложение.

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

  • Ох - узнайте, каковы ожидания! Не стоит оптимизировать время загрузки вашего приложения, если оно загружается только три раза в год.

+0

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

0

Я бы сказал, что шаги были бы:

  1. Определить фактическую функциональность, которая медленно, основанный на использовании системы или анкетирование пользователей. Это должно сузить проблемные области (и если никто не жалуется, может быть, нет проблем.)
  2. Запустите профилировщик кода (например, dotTrace/Compuware) и профилировщик уровня данных (например, SQL Profiler, NHibernate Profiler, в зависимости от того, что вы 're using.) Вы должны получить хорошие результаты после дня или около того реального использования.
  3. Если вы не можете получить хорошее представление о проблемах из этого, добавьте дополнительный код секундомера в следующую живую сборку, которая регистрирует количество миллисекунд в каждой операции.

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

1

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

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

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

+0

Спасибо bta. Я был бы более заинтересован в оценке производительности Java. –

+0

Моя цель в этом вопросе заключалась в том, что в дополнение к инструментам профилирования существует ли какая-то «нетрадиционная» модель для выявления узких мест –

Смежные вопросы