es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Intentando entender la causa del aumento en el tiempo de compilación al pasar de C++11 a C++14

Migrando de C++11 a C++14, tengo un archivo fuente que normalmente se compila en ~20s en modo C++11, pero cuando compilo el mismo archivo en modo C++14, el tiempo de compilación aumenta a ~340s. Eso supone un aumento de aproximadamente 17 veces. El tamaño del código objeto generado se duplica.

Para aclarar mi pregunta, estoy tratando de entender tanto qué hay en el código como por qué el compilador tarda tanto tiempo en compilar el mismo código al cambiar la bandera “-std=c++11/c++14” para “g++”.

Para hacer una comparación justa, ejecuté el preprocesador sobre el código (en modo C++11) y compilé la salida con las banderas tanto de C++11 como de C++14. Por ejemplo:

g++ -E -std=c++11 -g -O2 -o spaghetti.E spaghetti.cpp
g++ -c -std=c++11 -g -O2 -o spaghetti-11.o -x c++ spaghetti.E
g++ -c -std=c++14 -g -O2 -o spaghetti-14.o -x c++ spaghetti.E

El archivo en cuestión tiene muchos arrays de objetos de tamaño fijo en forma de plantilla, como por ejemplo:

template<typename t,="" std::size_t="" n="">
struct Object {
    std::array<t,n> storage{};
    std::vector<t> counters;
};

Los símbolos que involucran a Object se duplican al compilar con C++14 en comparación con C++11 (entre otros).

Entonces, ¿qué motiva al compilador a tardar 17 veces más en compilar el mismo archivo?
Y, ¿qué debería cambiar para reducir esto?

Debo señalar que si cambio la implementación de Object así:

template<typename t,="" std::size_t="" n="">
struct Object {
    std::vector<t> storage{};  // antes era std::array, N se utiliza en otros miembros
    std::vector<t> counters;
};

Se compilará rápidamente tanto bajo C++11 como bajo C++14.</t,n>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El compilador tarda 17 veces más en compilar el mismo archivo en modo C++14 debido a la mayor complejidad y características del estándar C++14, en comparación con C++11. C++14 introduce varias características nuevas, como un mejor rendimiento en tiempo de compilación, lambdas genéricas, matrices de tamaño de tiempo de ejecucción, lambdas polimórficas y más. Esta mayor complejidad y conjunto de características requiere más tiempo de procesamiento y cálculo por parte del compilador, lo que resulta en tiempos de compilación más largos.

    Para reducir este tiempo de compilación, podría ser útil optimizar el propio código, eliminando cualquier código innecesario, minimizando el uso de plantillas o características complejas, utilizando algoritmos adecuados para la plataforma objetivo, entre otros. Alternativamente, una opción podría ser mejorar los recursos de hardware, como utilizar un procesador más rápido o más RAM, para ayudar con los requisitos adicionales de procesamiento de la compilación de C++14. Otro enfoque podría ser cambiar a un compilador o sistema de compilación diferente que pueda optimizar y gestionar mejor el código C++14 para obtener tiempos de compilación más rápidos.

Comments are closed.