Недавно коллега указал мне, что компиляция всего в один файл создала гораздо более эффективный код, чем компиляция отдельных объектных файлов - , даже при оптимизации времени ссылки. Кроме того, общее время компиляции проекта значительно сократилось. Учитывая, что одной из основных причин использования С++ является эффективность кода, это меня удивило.
Ясно, что когда архиватор/компоновщик создает библиотеку из объектных файлов или связывает их с исполняемым файлом, даже штрафы за оптимизацию штрафуются. В приведенном ниже примере трилальная инкрустация стоит 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++; }
результаты выполнения: производительность 1,8% связана с использованием связанного foo вместо встроенного foo2.
$ ./release/testlink.exe 100000000
time : 13.375
time : 13.14
И да, флаги оптимизации компоновщика (/LTCG) включены.