Я хочу улучшить производительность конкретного метода в более крупном приложении.
Целью является улучшение латентности (настенное время, затрачиваемое на определенную функцию), а не (необязательно) нагрузка системы.
Требования:
- Поскольку я ожидаю, что большая часть задержки будет связана с I/O, учтите время, потраченное на ожидание/блокировку (другими словами: посмотрите на время настенных часов вместо процессорного времени).
- Поскольку программа выполняет гораздо больше, чем фрагмент, который я пытаюсь оптимизировать. Должен быть способ запуска или остановки профилирования программным путем или для фильтрации вывода, чтобы отображать только время между входом и выходом из оптимизируемой функции.
- Профилирование на уровне метода допустимо (если это можно сделать на уровне инструкций, даже лучше, если он только проецирует системные вызовы, что, вероятно, недостаточно)
- Это для хобби проекта, поэтому дорогостоящие инструменты на самом деле не вариант
- Прибор (-finstrument-functions) допустим
- Критический фрагмент кода, который меня интересует, трудно прерывать вручную (потому что он уже относительно быстр и трудно реалистично вызывается в цикле), поэтому необходима какая-то автоматизация.
Инструменты, отброшенные до сих пор:
- gprof, oprofile, callgrind (требование 1)
- создание чего-то пользовательского с использованием getrusage (требование 1)
- poormansprofiler.org(требование 2)
- strace -T, dtrace, http://perf.wiki.kernel.org (требования 2 и 3)
- VTune, Zoom (требование 4)
- выборка ручного набора вызовов (требование 6)
- google-perftools (должен быть способен измерять время на стене, но это, похоже, не работает в моем случае, по-видимому, из-за помех SIGALRM.
- systemtap (мое ядро не исправлено, чтобы включить utrace)
Другие параметры, которые я еще не оценил еще:
- cprof (не строится здесь из коробки, кажется, только i386)
- ручная установка точек трассировки (например, с помощью lttng)
Мне бы хотелось услышать о:
- другие параметры
- Возможно, я слишком рано отбросил какой-то инструмент?
- имеют ли параметры, которые я еще не оценил, имеют шанс работать, и если да, то как это сделать лучше всего.
Я наконец решил:
- создать что-то пользовательское, используя функции -finstrument-functions, на основе http://balau82.wordpress.com/2010/10/06/trace-and-profile-function-calls-with-gcc/
Трассировка этого грубого инструмента трудно интерпретировать, и я могу легко представить некоторые инструменты для дальнейшей обработки его вывода, что делает его бесконечно более полезным. Тем не менее, эта работа для меня на данный момент, поэтому я откладываю этот проект до конца;).