Recientemente, un compañero de trabajo me señaló que la compilación de todo en un solo archivo creaba un código mucho más eficiente que la compilación de archivos de objetos separados: incluso con la optimización del tiempo de enlace activada. Además, el tiempo de compilación total del proyecto disminuyó significativamente. Dado que una de las razones principales para usar C++ es la eficiencia del código, esto me sorprendió.¿Por qué la optimización del enlazador es tan pobre?
Claramente, cuando el archivador/enlazador crea una biblioteca de archivos de objetos, o los vincula en un archivo ejecutable, incluso las optimizaciones simples son penalizadas. En el siguiente ejemplo, la creación trival cuesta un 1.8% de rendimiento cuando lo hace el vinculador en lugar del compilador. Parece que la tecnología de compilación debe ser lo suficientemente avanzada como para manejar situaciones bastante comunes como esta, pero no está sucediendo.
edición:
Aquí está un ejemplo sencillo utilizando 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++; }
resultados de ejecución: 1,8% impacto en el rendimiento al uso de foo ligado vez de foo2 en línea.
$ ./release/testlink.exe 100000000
time : 13.375
time : 13.14
Y sí, los indicadores de optimización del enlazador (/ LTCG) están activados.
¿Qué compilador estás usando? VC++ tiene una opción llamada Whole Program Optimization, que creo que hará lo que esté pidiendo. –
La mayoría de las compilaciones modernas tienen la opción de "optimización del tiempo de enlace", pero generalmente es opcional, ya que ralentiza significativamente el enlace. ¿Lo has habilitado en tu prueba? Normalmente permite la creación de objetos cruzados, entre otras cosas. –
Una de las principales razones de C++ es la eficiencia del código * fuente *; aplicar este argumento al código objeto es engañoso. – harpo