Я думаю, вам нужна автоматическая инструментация и/или профилирование. GCC может сделать для вас оптимизацию по профилю. Помимо других инструментов, в документации даже упоминается хук для реализации собственного пользовательского инструментария.
Существует несколько инструментов анализа производительности, таких как профилировщики perf
и gprof
.
Кроме того, выполнение внутри виртуальной машины может (по крайней мере, теоретически) делать то, что вам нужно. valgrind
приходит на ум. Я думаю, valgrind действительно знает обо всех обращениях к памяти. Я бы искал способы получить эту информацию (а затем сопоставить ее с файлами карты).
Я не знаю, решит ли какой-либо из вышеперечисленных инструментов именно вашу проблему, но вы определенно можете использовать, скажем, perf (если он доступен для вашей платформы), чтобы увидеть, в каких областях кода находится значительное время. потраченный. Тогда, вероятно, либо много дорогостоящих обращений к памяти, либо просто интенсивные вычисления, вы можете понять, в чем дело, глядя на код.
Обратите внимание, что компилятор уже размещает часто используемые переменные в регистрах, поэтому информация, которую вы ищете, не даст вам точной картины. т.е. в то время как к некоторой переменной можно обращаться часто, выделение кэша может не сильно улучшить ситуацию, если ее значение уже находится в регистре большую часть времени.
Также учтите, что оптимизация сильно влияет на вашу программу на уровне сборки. Таким образом, любая статистика производительности, такая как счетчики доступа к памяти, будет отличаться с оптимизацией и без нее. А что вас должно заинтересовать, так это оптимизированный корпус. С другой стороны, восстановление информации о том, какое место соответствует какой переменной, с оптимизированной программой сложнее, если вообще возможно.
person
Vladislav Ivanishin
schedule
21.06.2019