Как 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?