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

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

Например, если я хочу представить определенную стандартную программу поздно в процессе выполнения программы, но не знаю то, что называют там, я думал бы, чтобы поместить эту стандартную программу только как триггер и начальное состояние для потоков как Прочь, и затем выбрать "Full check by Routines/Lines". Однако, когда я делаю это, выполнение программы в большой степени уже замедляется, прежде чем триггерная стандартная программа когда-либо поражалась.

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

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

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

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

6
задан Antti Suni 6 April 2010 в 13:07
поделиться

5 ответов

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

begin
    DoStuff();
end;

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

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

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

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

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

4
ответ дан 9 December 2019 в 22:31
поделиться

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

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

5
ответ дан 9 December 2019 в 22:31
поделиться

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

AQtimeHelpers.EnableProfiling(false); 

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

AQtimeHelpers.EnableProfiling(True); 

после?

0
ответ дан 9 December 2019 в 22:31
поделиться

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

0
ответ дан 9 December 2019 в 22:31
поделиться

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

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

2
ответ дан 9 December 2019 в 22:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: