Когда вы профилируете код с помощью рекурсивных функций, решение о том, как накапливать время, затрачиваемое на вызываемых, до их вызывающих, становится сложным. Если вы профилируете следующий код (Lua):
function a(n)
wait(10)
if n > 0 then
a(n-1)
end
end
a(1)
и, для целей анализа, только строка wait(10)
занимает какое-то время, какое дочернее время следует отнести к строке a(n-1)
?
Два хороших свойства профиля:
- Дочернее время для функции должно быть суммой дочерних времен ее строк (и аналогично для собственного времени)
- Сумма времени ребенка и собственного времени для строки будет той, которую вы измерили бы, если бы вы обернули строку в вызовы к
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)?