Как AQTime это делает?

Я тестировал профилировщик производительности и памяти AQTime, чтобы понять, стоит ли тратить эти большие $$$ на это для моего приложения Delphi.

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

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

Знаете ли вы, какие методы они используют для построчного захвата выполнения без изменения кода?

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

4 ответа

Решение

Это всего лишь предположение, но, возможно, AQtime основан на технологии, аналогичной Microsoft Detours?

Detours - это библиотека для инструментов произвольных функций Win32 на машинах x86, x64 и IA64. Detours перехватывает функции Win32, переписывая код в памяти для целевых функций.

Я сделал профилировщик с открытым исходным кодом для Delphi, который делает то же самое: http://code.google.com/p/asmprofiler/

Это не идеально, но это бесплатно:-). Также используется техника Detour. Он хранит каждый вызов (вы должны вручную установить, какие функции вы хотите профилировать), поэтому он может создать точное дерево истории вызовов, включая временную диаграмму (!).

Я не знаю, в частности, о Delphi, но отладчик приложения C может относительно легко выполнять построчное профилирование - он может загружать код и связывать каждый путь кода с блоком кода. Затем он может нарушить все инструкции условного перехода и просто посмотреть и посмотреть, какой путь к коду взят. Отладчики, такие как gdb, могут работать относительно эффективно, потому что они работают через ядро ​​и не модифицируют код, они просто получают информацию при выполнении каждой строки. Если что-то вызывает преждевременный выход из блока (longjmp), отладчик может перехватить это и выяснить, как далеко он попал в блоки, когда это произошло, и увеличить только эти строки.

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

У давно не существовавшего TurboPower также был отличный инструмент для профилирования / анализа для Delphi под названием Sleuth QA Suite. Я обнаружил, что это намного проще, чем AQTime, но гораздо проще получить значимый результат. Может быть стоит попытаться выследить - может, eBay?

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