Ответ 1
О, мужик, с чего начать?
Во-первых, я поражен, что это новости. Во-вторых, проблема заключается не в том, что профилировщики плохие, а в том, что некоторые профилировщики плохи. Авторы построили один, который, по их мнению, хорош, просто избегая некоторых ошибок, которые они обнаружили в тех, которые они оценивали. Ошибки распространены из-за некоторых постоянных мифов об профилировании производительности.
Но пусть будет положительным. Если вы хотите найти возможности для ускорения, это действительно очень просто:
-
Отбор проб должен быть несовместим с состоянием программы.
Это означает, что это происходит по-настоящему случайным образом, независимо от того, работает ли программа в режиме ввода-вывода (кроме ввода пользователя) или в GC или в узком цикле процессора или что-то еще. -
Сэмплинг должен читать стек вызовов функций,
чтобы определить, какие утверждения были "активными" во время выборки. Причина в том, что каждый сайт вызова (точка, с которой вызывается функция) имеет процентную стоимость, равную половине времени, которое она находится в стеке. (Примечание: статья полностью посвящена самообслуживанию, игнорируя массовое воздействие предотвращаемых вызовов функций в большом программном обеспечении. Фактически причина оригинальногоgprof
заключалась в том, чтобы помочь найти эти вызовы.) -
Отчетность должна показывать процент за строкой (не по функциям).
Если "горячая" функция идентифицирована, все еще нужно искать ее внутри "горячих" строк кода, учитывающих время. Эта информация находится в образцах! Зачем скрывать это?
Почти универсальная ошибка (которую разделяет газета) требует слишком многого с точностью измерения, и недостаточно с точностью местоположения. Например, вот пример настройки производительности в котором была выявлена и исправлена серия проблем с производительностью, что привело к усугублению ускорения в 43 раза. Не важно точно знать размер каждой проблемы до ее фиксации, но знать ее местоположение. Явление настройки производительности заключается в том, что устранение одной проблемы за счет сокращения времени увеличивает процент оставшихся проблем, поэтому их легче найти. Пока обнаружена и исправлена какая-либо проблема, делается прогресс в достижении цели поиска и устранения всех проблем. Нет необходимости фиксировать их при уменьшении размера, но важно их точно определить.
В отношении статистической точности измерения, если точка вызова находится в стеке, часть процента времени F (например, 20%) и N (например, 100) выборок случайного времени берутся, а затем количество выборок, которые показать, что точка вызова является биномиальным распределением со средним значением = NF = 20, стандартное отклонение = sqrt (NF (1-F)) = sqrt (16) = 4. Таким образом, процент образцов, которые показывают это, будет составлять 20% +/- 4%. Так это точно? Не совсем, но проблема была найдена? Точно.
На самом деле, чем больше проблема, тем больше процентов, чтобы найти ее. Например, если взяты 3 выборки, и на 2 из них отображается точка вызова, это, скорее всего, будет очень дорогостоящим. (В частности, это следует за бета-распределением. Если вы генерируете 4 одинаковых 0,1 случайных числа и сортируете их, распределение третьего - это распределение стоимости для этой точки вызова. Это означает, что (2 + 1)/(3 + 2) = 0,6, так что это ожидаемая экономия, учитывая эти образцы.) INSERTED: А коэффициент ускорения, который вы получаете, регулируется другим дистрибутивом BetaPrime, а его среднее значение равно 4. Поэтому, если вы берете 3 образца, см. Проблему на 2 из них, и устранить эту проблему, в среднем вы будете делать программу в четыре раза быстрее.
Настало время, когда мы программисты выбивали паутину из головы на тему профилирования.
Отказ от ответственности - документ не ссылался на мою статью: Dunlavey, "Настройка производительности с затратами на уровне инструкций, полученными из выборки вызовов", ACM SIGPLAN Уведомления 42, 8 (август 2007 г.), стр. 4-8.