Как правильно (или хорошо) при профилировании накапливать время вызовов для абонентов? - PullRequest
4 голосов
/ 03 мая 2011

Когда вы профилируете код с помощью рекурсивных функций, решение о том, как накапливать время, затрачиваемое на вызываемых, до их вызывающих, становится сложным. Если вы профилируете следующий код (Lua):

function a(n)
  wait(10)
  if n > 0 then
    a(n-1)
  end
end

a(1)

и, для целей анализа, только строка wait(10) занимает какое-то время, какое дочернее время следует отнести к строке a(n-1)?

Два хороших свойства профиля:

  1. Дочернее время для функции должно быть суммой дочерних времен ее строк (и аналогично для собственного времени)
  2. Сумма времени ребенка и собственного времени для строки будет той, которую вы измерили бы, если бы вы обернули строку в вызовы к os.clock() (или эквивалентному)

Если a(n-1) получает дочернее время 0, то вы получаете (1), но не (2). Если a(n-1) получает дочернее время 10, вы получаете (2), но не (1).

Я прочитал, но, возможно, не понял, эта статья о gprof . Насколько я могу судить, они согласны, что это сложная проблема, и их решение дало бы a(n-1) дочернее время 0. Я не уверен, как это будет работать в случае a() звонка b() звонка a().

Кто-нибудь знает, является ли 0 или 10 лучшим ответом и почему? Или, что еще лучше, есть другое решение, которое учитывает как (1), так и (2)?

1 Ответ

0 голосов
/ 03 мая 2011

Эта статья о gprof Грэма, Кесслера и МакКузика описывает

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