Performance gcc链接顺序是否影响程序执行的速度

Performance gcc链接顺序是否影响程序执行的速度,performance,gcc,linker,g++,ld,Performance,Gcc,Linker,G++,Ld,我知道gcc中的链接顺序对于正确确定符号很重要;但是 现在,我在生成的可执行文件上看到了一个奇怪的速度问题。我将对象和归档链接为 g++-m32 a.o b.o ar1.a ar2.a-lm-lpthread-lcrypt-lz-pthread-o afast.out vs g++-m32 a.o ar1.a b.o ar2.a-lm-lpthread-lcrypt-lz-pthread-o aslow.out 第二个版本运行速度慢2倍。b、 o实际上在ar1.a文档中,但ar2.o引用了它,因

我知道gcc中的链接顺序对于正确确定符号很重要;但是 现在,我在生成的可执行文件上看到了一个奇怪的速度问题。我将对象和归档链接为

g++-m32 a.o b.o ar1.a ar2.a-lm-lpthread-lcrypt-lz-pthread-o afast.out

vs

g++-m32 a.o ar1.a b.o ar2.a-lm-lpthread-lcrypt-lz-pthread-o aslow.out

第二个版本运行速度慢2倍。b、 o实际上在ar1.a文档中,但ar2.o引用了它,因此链接器抱怨,因此我不得不把b.o.在开始时,我一直把b.o放在链接的末尾,以确定正确的依赖顺序,尽管后来发现它甚至在开始时就可以工作,而且速度更快

有人经历过吗?对象文件链接顺序与归档顺序不同吗?怎么会有速度影响

使用gcc3.4.6或gcc4.1.2获得类似的结果取决于目标代码在内存中的布局方式,执行速度可能存在显著差异。通常,您希望热函数紧密结合在一起,这样它们就不会与冷函数混淆,并且
Icache
TLB
不会被冷函数污染。但是,您受此影响的可能性很小

最有可能的是,有些符号在“快速”可执行文件中以一种方式解析,在“慢速”可执行文件中以另一种方式解析。在命令行上归档库和对象文件的顺序,您可以在“快速”链接中从
ar1.a
中提取一些对象,而在“慢速”链接中从
ar2.a
中提取等效对象。也许在
ar2.a中有一些未优化的代码

第一步是运行
nm-A ar1.A ar2.A
并检查两者中是否出现任何符号。然后,您可以要求链接器生成链接映射(使用
-Wl,-M,map.out
)并检查这些符号在两个链接中的实际来源