Как-то пару лет назад у меня было много задач по работе связанных с перформансом, и я много времени проводил работая с valgrind и с визуализатором для него - KCachegrind. KCachegrind замечательно всё визуализировал, но мне очень не хватало возможности показать разницу между двумя профилями callgrind‘а. Первое время я справлялся тем образом, что просто открывал два профиля в двух разных окнах и глазами строчка за строчкой отслеживал где значения разнятся, но мне очень быстро это надоело. Я стал искать есть ли где-то такой инструмент, наверняка не я один с такими задачами сталкиваюсь, но к сожалению не нашёл ничего подходящего для меня, но вот что нашлось:
- скрипт cg_diff в исходниках valgrind, но он работает с профилями для cachegrind
- скрипт callgrind_diff.sh в одном из PR на гитхабе (по каким конкретно причинами он мне не подошёл уже к сожалению не помню)
А потом я увидел утилиту cgview в исходниках KCachegrind, где уже был готов весь API для доступа к данным профиля callgrind. Чтобы решить мои проблемы мне оставалось только сделать diff часть для этого тула, что я и сделал.
И получился cgdiff. И пока я решал свои задачи по работе - тул понемногу обрастал фичами (разные сортировки, по абсолютным величинам, относительным, per-call изменениям, фильтрация по именам функций, по минимальной величине изменений и т.д.). Код я особо не причёсывал, но надеюсь у меня когда-нибудь найдётся время им снова заняться и может даже протолкнуть его в KCachegrind если это будет кому-то полезно.