Если профилировщик не ответ, какие у нас есть другие варианты? - PullRequest
39 голосов
/ 08 декабря 2010

После просмотра презентации Джошуа Блоха «Беспокойство по поводу производительности» я прочитал статью, которую он предложил в презентации «Оценка точности профилей Java» . Цитирую заключение:

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

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

ОБНОВЛЕНИЕ : Пункт, который, кажется, упущен в обсуждении, - эффект наблюдателя . Можем ли мы создать профилировщик, который действительно ' наблюдатель эффект ' - бесплатно?

Ответы [ 5 ]

41 голосов
/ 08 декабря 2010

О, чувак, с чего начать?

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

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

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

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

  • В отчетах должно отображаться процентов по строке (не по функциям).
    Если определена «горячая» функция, в ней все равно приходится искать «горячие» линиикод учета по времени.Эта информация в примерах !Зачем это скрывать?

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

В отношении статистической точности измерения, если точка вызова находится в стеке в некоторый процент времени F (например,20%) и N (например, 100) выборок случайного времени, затем число выборок, которые показывают точку вызова, является биномиальным распределением, со средним значением = NF = 20, стандартным отклонением = sqrt (NF (1-F)) = sqrt (16) = 4. Таким образом, процент выборок, которые показывают, будет 20% +/- 4%.Так это точно?Не совсем, но была ли проблема найдена?Точно.

На самом деле, чем больше проблема, выраженная в процентах, тем меньше образцов требуется для ее определения.Например, если отобраны 3 образца и на 2 из них обнаружена точка вызова, весьма вероятно, что это будет очень дорого.(В частности, он следует бета-распределению. Если вы генерируете 4 одинаковых случайных числа по 0,1 и сортируете их, распределение 3-го - это распределение затрат для этой точки вызова. Это среднее значение (2 + 1) / (3 + 2) = 0,6, так что это ожидаемая экономия, учитывая эти образцы.) ВСТАВЛЕНО: И коэффициент ускорения, который вы получаете, определяется другим распределением, BetaPrime и его среднее значение равно 4. Поэтому, если вы возьмете 3 семпла, увидите проблему на двух из них и устраните эту проблему, в среднем вы сделаете программу в четыре раза быстрее.

Самое время нампрограммисты сдули паутину с головы на предмет профилирования.

Отказ от ответственности - в статье не было ссылки на мою статью: Dunlavey, «Настройка производительности с учетом затрат на уровне команд, полученных из выборки из стека вызовов», Уведомления ACM SIGPLAN 42, 8 (август 2007 г.), стр. 4-8.

8 голосов
/ 08 декабря 2010

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

Вывод статьи таков: не могу поверить в результат профайлеры. Но тогда, что это альтернатива использования профилировщиков.

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

3 голосов
/ 08 декабря 2010

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

У меня есть опыт работы с http://www.dynatrace.com/en/, и я могу сказать, что он очень хорош в поиске низко висящих фруктов.

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

0 голосов
/ 08 декабря 2010

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

0 голосов
/ 08 декабря 2010

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

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

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

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