最近,我的一个同事指出,将所有内容编译成单个文件比编译单独的对象文件更有效 - 即使启用了链接时间优化。此外,项目的总编译时间显著缩短。考虑到使用C ++ 的主要原因之一是代码效率,这让我感到惊讶。
很明显,当归档程序/链接器将对象文件制作成库,或将它们链接到可执行文件中时,即使进行简单的优化也会受到惩罚。在下面的示例中,当由链接器而不是编译器进行简单内联时,性能下降了1.8%。看起来编译器技术应该足够先进,可以处理相当常见的情况,但实际上并没有发生。
以下是使用Visual Studio 2008的简单示例:
#include <cstdlib>
#include <iostream>
#include <boost/timer.hpp>
using namespace std;
int foo(int x);
int foo2(int x) { return x++; }
int main(int argc, char** argv)
{
boost::timer t;
t.restart();
for (int i=0; i<atoi(argv[1]); i++)
foo (i);
cout << "time : " << t.elapsed() << endl;
t.restart();
for (int i=0; i<atoi(argv[1]); i++)
foo2 (i);
cout << "time : " << t.elapsed() << endl;
}
foo.cpp
int foo (int x) { return x++; }
运行结果:使用链接的foo
相比内联foo2
会有1.8%的性能损失。
$ ./release/testlink.exe 100000000
time : 13.375
time : 13.14
是的,链接器优化标志(/LTCG)已经启用。