我正在尝试优化C代码项目。
我想计算使用全局变量(读或写)以将其置于最合适的内存类型的次数。
例如,以快速访问内存类型存储常用变量。
出于确定性原因禁用了数据缓存。
有没有一种方法可以在不插入计数器或不添加额外代码的情况下计算使用变量的次数?例如使用汇编代码?
代码用C编写。
我拥有的
A。(.map)文件,由GCC编译器生成,我从中提取全局变量的名称,地址和大小。
B)使用GCC编译器-S标志生成的项目的汇编代码。
非常感谢
答案 0 :(得分:0)
您可以使用Visual Studio(或其他IDE)来执行此操作:搜索在源代码中使用变量的所有位置,放置条件断点,记录一些信息,附加到进程,并启动功能使用该变量。您可以在输出窗口中计数实例。
答案 1 :(得分:0)
GDB有一个叫做 watchpoints 的东西:https://sourceware.org/gdb/onlinedocs/gdb/Set-Watchpoints.html
设置表达式的监视点。 GDB会在表达式中断时 expr由程序写入,其值会更改。的 此命令最简单(也是最受欢迎)的用法是观看 单个变量的值:
(gdb)看foo
awatch [-l | -location] expr [thread thread-id] [mask maskvalue]
设置一个观察点,该观察点将在读取或写入expr时中断 进入程序。
命令可以附加到监视点:https://sourceware.org/gdb/onlinedocs/gdb/Break-Commands.html#Break-Commands
您可以给任何断点(或观察点或捕获点)一系列命令,以便在程序由于该断点而停止时执行…例如,这是使用断点命令进行打印的方式 每当x为正数时,在foo入口处的x值。
import axios from 'axios';
export const APIAuth = axios.create({
baseURL: 'kerberos_server_url',
withCredentials: true,
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
})
该命令通常应增加变量或将“读/写”打印到文件中,但是您实际上也可以添加其他内容,例如回溯。不确定使用gdb进行向外通信的最佳方法。也许以交互模式运行它就足够了。
答案 2 :(得分:0)
我认为,您需要的是自动检测和/或配置文件。 GCC实际上可以为您进行配置文件引导的优化。与other types of instrumentation一样,文档甚至提到了用于实现自己的自定义工具的钩子。
目前有几种性能分析工具,例如perf
和gprof
分析器。
此外,在虚拟机内部执行可以(至少在理论上)执行您要执行的操作。我想到了valgrind
。我认为,valgrind实际上了解所有内存访问。我会寻找获取此信息的方法(然后将其与地图文件进行核对)。
我不知道上述任何工具是否可以完全解决您的问题,但是您可以肯定地说,使用perf(如果您的平台可用)查看哪些代码区域花了大量时间。然后可能有很多昂贵的内存访问,或者仅仅是密集的计算,您可以通过看一下代码来弄清楚是哪种情况。
请注意,编译器已将经常访问的变量分配给寄存器,因此您所需要的信息不会给您准确的印象。即尽管某些变量可能会被大量访问,但如果其值大部分时间已经存在于寄存器中,则对其进行高速缓存分配可能并不会改善很多情况。
还要考虑优化在程序集级别上对程序的影响很大。因此,无论是否进行优化,任何性能统计信息(例如内存访问计数器)都将有所不同。优化的案例是您应该感兴趣的。另一方面,如果根本不可行,则使用优化程序恢复有关哪个位置对应于哪个变量的信息变得更加困难。