我正在对Thumb2可执行文件进行二进制检测,我注意到在我的一些基准测试中,检测的二进制文件比原始文件执行得更好(非常奇怪,因为我的仪器添加了更多的代码来执行)。
考虑到这种异常现象,我得出的结论是,性能差异是由我处理程序返回的不同方式引起的。在原始可执行文件中,大多数返回都是用
处理的pop {..., pc}
在我的仪器之后,这些被翻译为
pop {..., lr}
...
bx lr
因为我需要使用返回地址进行一些计算。
我能够通过一个简单的程序进一步测试这种行为,该程序调用子程序100万次,pop {lr}; bx lr
执行速度比pop {pc}
快49%(这是巨大的)。
所有测试均在运行Marvell Armada XP四核ARMv7 SoC的Scaleway C1 Baremetal Server上完成。
有人对此有解释吗?
修改
服务器运行Ubuntu 16.04。以下是我的测试的源代码:popcptest,bxlrtest。对于编译,我使用GCC Linaro版本5.4.0和默认设置。