Почему AQTime замедляет выполнение, даже если профилирование не включено, и можно ли что-нибудь сделать для этого?

В AQTime для Delphi он может очень быстро добираться до проблемных точек, используя области, триггеры и т. Д. Но мне кажется, что, особенно если у вас очень много кода в областях для профилирования, выполнение резко замедляется даже когда профилирование НЕ включено.

Например, если я хочу профилировать конкретную подпрограмму позднее в потоке программы, но не знаю, как она там вызывается, я бы подумал поместить эту подпрограмму только в качестве триггера, а исходный статус для потоков - как Выкл., А затем выберите "Полная проверка по процедурам / линиям". Однако, когда я делаю это, выполнение программы сильно замедляется еще до того, как на триггерную процедуру когда-либо попадет.

Например, если "процесс подготовки" занимает около 5 минут без AQTime, то, когда я запускаю его с отключенным профилированием, он уже работает в течение 30 минут и продолжает работать, даже когда я знаю, что триггер еще даже не был достигнут.

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

Еще один, часто лучший обходной путь - запустить приложение без AQTime, а затем использовать Attach to Process после завершения "потока подготовки", но это работает хорошо только тогда, когда выполнение приостанавливается в GUI в нужном месте или иным образом обеспечивает подходящий период времени. для выполнения прикрепления. Во всех случаях это не так.

Любые комментарии о том, почему это так, и есть ли что-то еще, кроме как просто попытаться уменьшить код из областей или присоединить позже к процессу?

5 ответов

Ну, вы можете попробовать мой бесплатный профилировщик, конечно:-)
http://code.google.com/p/asmprofiler/

Возможно профилирование и профилирование. Он имеет не все функциональные возможности AQTime, но, по крайней мере, он бесплатный (и очень незначительная потеря производительности, если вы прекратили профилирование).

AQTime - инструментальный профилировщик. Во время выполнения он по существу окружает каждый метод (или строку, в зависимости от того, как вы настроили параметры), который вы выбрали для профилирования со своим собственным кодом, примерно так:

begin
    DoStuff();
end;

... становится:

begin
    AQTimeEnter('MethodName');
    try
        DoStuff();
    finally
        AQTimeLeave('MethodName');
    end;
end;

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

Когда профилирование неактивно, накладные расходы меньше, потому что они ничего не регистрируют. Однако для самого вызова метода все еще есть некоторые издержки плюс блок try/finally.

Я не знаю, можете ли вы что-либо сделать в AQTime, чтобы улучшить это, кроме того, чтобы меньше профилировать. Однако вы также можете попробовать сэмплерный профилировщик, который имеет меньше накладных расходов для самого профилировщика, но может пропустить вызовы подпрограмм, которые выполняются быстро.

Итак, что вы подразумеваете под "Полная проверка по рутинам / линиям". Между рутинами и линиями есть большая разница. Процедуры профилирования не должны сильно замедлять ваше приложение. Это не для меня. Профилирование по линиям может быть очень медленным, я думаю, это то, что вы делаете сейчас.

В общем, идея состоит в том, чтобы сначала профилировать по подпрограммам, находить узкие места, а затем профилировать эти (и только те) подпрограммы построчно.

Вы пытались использовать

AQtimeHelpers.EnableProfiling(false); 

в начале вашей подготовки, а затем

AQtimeHelpers.EnableProfiling(True); 

после?

Вы должны использовать детализированный подход. Сначала определите области, для которых требуется профилирование по процедурам, определите, какие процедуры требуют профилирования, профилируйте только их и переключайтесь на профилирование строк только тогда, когда необходимо точно определить строку кода, требующую внимания. Если вы включите полное профилирование приложения построчно, инструментарий, выполняемый AQTime, будет настолько тяжелым, а данные, собранные настолько, что это сильно замедлит работу вашего приложения.

Другие вопросы по тегам