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