2

В чем разница между методами профилирования на основе трассировки и выборки в Android Traceview? Я думал, что основанный на трассировке более точный, однако, похоже, что он может исказить фактические времена процессора, особенно если есть другие вызовы с функцией.Разница между профилированием метода на основе трассировки на основе трассировки и выборки на основе выборки и ее влиянием на сообщенные времена процессора

Например, я хочу оценить функцию A, которая имеет две реализации, такие как A-1 и A-2.

  1. У A-1 есть еще один вызов функции, такой как A-1-1.
  2. A-2 также имеет больше функций, таких как A-1-1, однако A-1-1 имеет также один вызов функции внутри него, такой как A-1-1-1.

Теперь я думаю, что профилирование на основе трассировки будет сообщать о более высоких значениях для A-2, потому что ему нужно отслеживать одну дополнительную функцию A-1-1-1, и это дополнительное использование процессора будет сообщено в процессорное время А-2. Я прав ?

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

С другой стороны, проблема с методом на основе выборки заключается в том, что она не может улавливать очень легкие функции. Что делать, если моя функция занимает 0,2 миллисекунды процессорного времени, а интервал выборки составляет 1 миллисекунду? Я сделал несколько экспериментов с ним, и он не может поймать легкие вызовы функций. Любые идеи или ссылки на документацию об их различиях?

Последний вопрос: какой из них более точный для относительных сравнений?

ответ

1

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

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

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

Что делать, если моя функция занимает 0,2 миллисекунды процессорного времени, а выборка интервал составляет 1 миллисекунду?

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

  • Если функция вызывается часто (скажем, 50 раз за интервал) и не улавливается сэмплером, это означает, что она никогда не работает в точке в выборке. Это означает, что это достаточно быстро.

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

+0

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

+0

Он работает для вас, хорошо. У меня никогда не было хорошего опыта отслеживания на любом языке. Я всегда делал оптимизацию не очень важной части большой системы. –

+0

Я не использую его для оптимизации. Только для отчетов относительные времена процессора для различных алгоритмов внутри вызова функции. Например, что алгоритм А имеет 2% использования процессора, а В - 5%. – utengr