2012-04-17 4 views
4

У нас есть одна машина в доме, которая в 20 раз медленнее, начиная с нашего приложения Delphi 7, чем любая другая машина.Дистанционное профилирование с D7 (не профилирование памяти, но выбор времени ...)

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

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

Мы не хотим тратить время на создание всей среды разработки D7 IDE, чтобы мы могли использовать AQTime для профилирования нашего приложения на этой собственной машине.

Код слишком сложный, чтобы мы могли сами измерить его.

Любые предложения по профилировщику, которые собирают статистику высокого уровня (номер процедуры или номера строки) удаленно?

+0

Пробоотборщики пробоотбора не будут работать в нашей ситуации, так как мы уверены, что задержка происходит в глубине стека TCP/IP, а не в любом из наших модулей Delphi. – RobertFrank

ответ

1

Почему бы не установить AQTime на машину и использовать ее как отдельный профайлер? Нет необходимости в «всей среде разработки D7 IDE».

+0

Пока лицензия, которой они владеют, допускает это. Начиная с версии 7, он стал довольно ограничительным - модуль для удаленного профилирования, когда у вас странное поведение вне вашей машины-разработчика, было бы очень желанным. Они могут попробовать бесплатное издание, может быть, этого достаточно. –

+0

Не знаком со всем, кроме самого элементарного использования AQTime, я не знал, что его можно использовать без среды разработки. (У нас есть плавающая лицензия, так что это не проблема.) Какие файлы мне нужно переместить с моей машины разработки (в дополнение к .exe) на тестовую машину? Спасибо за ваше предложение выше и любую дополнительную информацию, которую вы можете предоставить. – RobertFrank

+2

@Robert: вам нужен только exe. Убедитесь, что он скомпилирован с информацией об отладке. В руководстве IIRC AQTime подробно объясняется это. – Giel

3

Посмотрите на SamplingProfiler. Он не выполняет «удаленное» профилирование, но также не требует среды разработки. Он просто должен иметь возможность запускать профилированную программу (чтобы она работала на одном компьютере), и программа должна иметь файл .MAP, сгенерированный компоновщиком в той же папке, что и .EXE. Если это внутри, это не должно быть проблемой для вас.

И если вы посмотрите файл справки, вы даже найдете способы его профилировать только определенные разделы вашей программы, которые AQTime не может сделать. Это помогает, если вы знаете, что проблема находится в одном конкретном месте, например, в стартовом коде.

+0

Информация об отладке TD32 также хорошо работает. – Thomas

+0

@Thomas: Не могли бы вы расширить и опубликовать ответ? – menjaraz

+1

@menjaraz: Нечего расширять, я просто упоминал, что SamplingProfiler также принимает разделы отладки TD32 в исполняемом файле, а не только файлы MAP, извините за неоднозначную формулировку. – Thomas

1

Вы можете использовать наш 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 (и его функции автоматического останова) у вас есть вся необходимая информация для этого.

Путем выполнения шагов по шагам вы очень быстро столкнетесь с узкими местами вашего приложения. И по желанию можно было бы сделать то же самое на стороне клиента.

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

1

Вы также можете попробовать свое свободное/открытое профилировщика выборки источник: http://code.google.com/p/asmprofiler/wiki/AsmProfilerSamplingMode

(я получить лучшие результаты, чем с SamplingProfiler) Он использует все виды символов Delphi отладки (.map, TD32, .jdbg , и т. д.)

Смежные вопросы