В AQTime для Delphi это хвастается, чтобы быть очень быстрым для получения до горячих точек при помощи областей и триггеров и т.д. Но мне, это особенно кажется, если у Вас есть очень много кода в областях для профилирования, затем выполнение замедляется существенно, даже когда профилирование не включено.
Например, если я хочу представить определенную стандартную программу поздно в процессе выполнения программы, но не знаю то, что называют там, я думал бы, чтобы поместить эту стандартную программу только как триггер и начальное состояние для потоков как Прочь, и затем выбрать "Full check by Routines/Lines". Однако, когда я делаю это, выполнение программы в большой степени уже замедляется, прежде чем триггерная стандартная программа когда-либо поражалась.
Например, если "поток подготовки" занимает приблизительно 5 минут без AQTime, то, когда я выполняю его с отключенным профилированием, он уже работал в течение 30 минут и все еще идет, даже когда я знаю, что триггер еще не был даже достигнут.
Я знаю, что могу попробовать к обходному решению это путем сокращения суммы представленных стандартных программ/строк, но это не действительно хорошее решение для меня, так как я хотел бы представить всех их, после того как я добираюсь до фактической триггерной стандартной программы.
Также другой, часто лучшее обходное решение должно запустить приложение без AQTime и затем использовать Присоединение для Обработки после того, как "поток подготовки" закончился, но это работает хорошо только, когда паузы выполнения в GUI в надлежащем месте или иначе обеспечивают подходящий период времени для того, чтобы сделать присоединение. Во всех случаях дело обстоит не так.
Какие-либо комментарии, почему это так и является там чем-либо еще, чтобы сделать, чем просто, пытаются уменьшить код от областей или присоединить позже к процессу?
AQTime - инструментальный профилировщик. Во время выполнения он по существу окружает каждый метод (или строку, в зависимости от того, как вы настроили параметры), который вы выбрали для профилирования, своим собственным кодом, примерно так:
begin
DoStuff();
end;
... становится:
begin
AQTimeEnter('MethodName');
try
DoStuff();
finally
AQTimeLeave('MethodName');
end;
end;
Это действительно так. это непосредственно в исполняемом файле, а не путем изменения исходного кода, но эффект по сути тот же. Когда профилирование активно, для этих вызовов возникают значительные накладные расходы, поскольку они запускаются довольно часто и регистрируют значительный объем информации.
Когда профилирование неактивно, накладные расходы меньше, потому что они ничего не регистрируют. Однако по-прежнему есть некоторые накладные расходы на сам вызов метода, а также на блок try / finally.
Я не знаю, можно ли что-нибудь сделать в AQTime, чтобы улучшить это, кроме уменьшения профиля. Однако вы также можете попробовать профилировщик выборки, который имеет меньше накладных расходов для самого профилировщика, но может пропускать вызовы подпрограмм, которые выполняются быстро.
Ну, вы, конечно, можете попробовать мой бесплатный профилировщик: -)
http://code.google.com/p/asmprofiler/
В нем возможно профилирование инструментов и выборки. В нем не все функции AQTime, но, по крайней мере, он есть бесплатно (и очень небольшая потеря производительности, если вы прекратили профилирование).
Пробовали ли вы использовать
AQtimeHelpers.EnableProfiling(false);
в начале подготовки, а затем
AQtimeHelpers.EnableProfiling(True);
после?
Вы должны использовать подход детализации. Сначала определите области, которые нуждаются в профилировании, по процедурам, определите, какие процедуры необходимо профилировать, профилируйте только их и переключайтесь на профилирование строк только тогда, когда необходимо точно определить строку кода, требующую внимания. Если вы включили полное профилирование приложения. Построчно, инструментарий, выполняемый AQTime, будет настолько тяжелым, а собираемых данных так много, что это сильно замедлит работу вашего приложения.
Так что вы подразумеваете под «полной проверкой по подпрограммам / строкам»? Между рутинами и строками есть большая разница. Процедуры профилирования не должны сильно замедлять работу вашего приложения. Это не для меня. Профилирование по строкам может быть очень медленным, я думаю, это то, что вы сейчас делаете.
В общем, идея состоит в том, чтобы сначала профилировать подпрограммы, найти узкие места, а затем профилировать эти (и только эти) подпрограммы по строкам.