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

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

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

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

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

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

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

Ответы [ 5 ]

5 голосов
/ 06 апреля 2010

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

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

4 голосов
/ 06 апреля 2010

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

begin
    DoStuff();
end;

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

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

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

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

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

2 голосов
/ 06 апреля 2010

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

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

0 голосов
/ 07 апреля 2010

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

0 голосов
/ 06 апреля 2010

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

AQtimeHelpers.EnableProfiling(false); 

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

AQtimeHelpers.EnableProfiling(True); 

после

...