Вы можете использовать наш Open Source TSynLog
class, чтобы добавить профилирование в любое приложение, а не только на компьютер разработчика.
Это не автоматизированный профайлер, как другие инструменты: вам нужно будет изменить свой код. Но он может выполняться по запросу удаленно и даже без связи вообще, даже со стороны конечного пользователя.
Вы добавляете некоторые профилирующие вызовы к некоторому методу кода, после чего ввод и выход из методов будут регистрироваться в текстовом файле. Затем доступен supplied log viewer и имеет специальный метод для профилирования и определения медленных методов.
Profiling methods from log http://blog.synopse.info/public/LogView01.png
механизм протоколирования может быть использована для отслеживания рекурсивных вызовов. Он может использовать механизм интерфейса на основе входа, когда вы входите и выходите любой метод:
procedure TMyDB.SQLExecute(const SQL: RawUTF8);
var ILog: ISynLog;
begin
ILog := TSynLogDB.Enter(self,'SQLExecute');
// do some stuff
ILog.Log(sllInfo,'SQL=%',[SQL]);
end; // when you leave the method, it will write the corresponding event to the log
он будет записан как таковой:
20110325 19325801 + MyDBUnit.TMyDB(004E11F4).SQLExecute
20110325 19325801 info SQL=SELECT * FROM Table;
20110325 19325801 - MyDBUnit.TMyDB(004E11F4).SQLExecute 00.000.507
Здесь имя метода задается в коде ('SQLExecute'
). Но если у вас есть связанный файл .map
, механизм регистрации может читать эту информацию о символе и записывать точный номер строки события. Вы даже можете использовать сжатую версию файла .map
(900 КБ .map
-> 70 КБ .mab
, то есть намного лучше, чем zip или lzma), или вставлять его содержимое в исполняемый файл во время сборки.Поэтому
Добавление профилирование на уровне метода является только вопрос добавления одной строки кода в начале этого метода, как таковой:
procedure TMyDB.SQLExecute(const SQL: RawUTF8);
begin
TSynLogDB.Enter;
// do some stuff
end; // when you leave the method, it will write the corresponding event to the log
временные метки высокого разрешения также записываются на файл (здесь 00.000.507
). Благодаря этому вы сможете профилировать свое приложение с данными, поступающими со стороны клиента, на его реальном компьютере. С помощью метода Enter
(и его функции автоматического останова) у вас есть вся необходимая информация для этого.
Путем выполнения шагов по шагам вы очень быстро столкнетесь с узкими местами вашего приложения. И по желанию можно было бы сделать то же самое на стороне клиента.
Я использовал это в нескольких приложениях и очень легко обнаружил несколько узких мест, даже на конкретном оборудовании, программном обеспечении и конфигурации сети (вы никогда не знаете, что используют ваши клиенты), очень легко.
Пробоотборщики пробоотбора не будут работать в нашей ситуации, так как мы уверены, что задержка происходит в глубине стека TCP/IP, а не в любом из наших модулей Delphi. – RobertFrank