2009-06-30 12 views
13

A menudo escucho a la gente elogiar la velocidad de compilación de C#. Hasta ahora solo he hecho algunas aplicaciones pequeñas, y de hecho noté que la compilación fue muy rápida. Sin embargo, me preguntaba si esto todavía se aplica a las aplicaciones grandes . ¿Los proyectos grandes de C# se compilan más rápido que los proyectos de C++ de un tamaño similar?Tiempo de compilación de C# para proyectos grandes (en comparación con C++)

+2

También me preguntaba lo mismo. Recopilé una pequeña aplicación en C# y la compilación fue sorprendentemente rápida en comparación con C++. – Naveen

+0

He trabajado en una solución que tenía más de 40 proyectos (no la creé) que tardó mucho (aproximadamente 1 minuto) en compilarse en un PIV. La actualización de mi PC a Core 2 lo redujo a un tiempo mucho más aceptable, al igual que la refacturación del código en menos proyectos. Tener muchos proyectos afectará el tiempo de compilación de los proyectos de C#. – RichardOD

Respuesta

5

Por lo que puedo decir por mi propia experiencia, sí, C# compila mucho más rápido que los proyectos de C++. Incluso para grandes aplicaciones.

Esto se puede explicar por el hecho de que C# es menos complicado que C++, y que C# se traduce a IL (que puede optimizarse y traducirse posteriormente a código máquina) y C++ se traduce inmediatamente al lenguaje de máquina .

10

Sí, C# normalmente compila mucho más rápido. No siempre lo suficientemente rápido sin embargo. Mi mayor base de código de C# con tal vez un millón de líneas de código con muchos proyectos tardó aproximadamente una hora en compilarse. Pero sospecho que gran parte de este tiempo se debe al sistema de construcción pobre de los estudios visuales. Por otro lado, el tiempo de compilación para C++ suele ser mucho más largo, pero también depende mucho más de cómo organices el código. El manejo deficiente de las dependencias de archivos de encabezado puede aumentar fácilmente el tiempo de compilación con varios órdenes de magnitud.

+4

+1 para comentar sobre el manejo deficiente del archivo de encabezado: ¡caímos de 1 hora a 8 minutos en nuestro gran proyecto de C++ al ordenar los archivos de encabezado! –

6

C++ es tan lento de compilar como los archivos de cabecera deben ser releídos y rastreados cada vez que se incluyen. Debido a la forma en que "#defines" funciona, es muy difícil para un compilador precompilar automáticamente todos los archivos de encabezado. (Modula-2 hizo un trabajo mucho mejor con esto) Tener cientos de encabezados leídos por cada archivo C++ que se compila es normal en muchos proyectos C++.

Algunas veces las compilaciones C++ incrementales pueden ser mucho más rápidas que C#. Si tiene todos sus archivos de encabezado C++ (y diseño) en muy buen estado (vea libros como Large-Scale C++ Software Design, Effective C++) Puede hacer un cambio en la implementación de una clase que es utilizada por la mayoría del sistema y solo tiene una compilación dll .

Como C# no tiene archivos de encabezado separados cada vez que cambia la implantación de una clase, todos los usos de la clase se vuelven a compilar incluso si la interfaz pública de la clase no ha cambiado. Esto se puede reducir en C# utilizando "programación basada en interfaz" e "inyección de dependencia", etc. Pero sigue siendo un problema.

Sin embargo, en general, creo que C# compila lo suficientemente rápido, pero los proyectos grandes de C++ son tan lentos de compilar que no quiero agregar métodos a una "clase base" debido al momento de la reconstrucción.

Tener muchos proyectos de Visual Studio con un puñado de clases en cada uno puede ralentizar mucho las construcciones de C#. Combinar proyectos relacionados en conjunto y luego "confiar" en que los desarrolladores no usen clases que son privadas para un espacio de nombres a veces puede tener un gran beneficio. (nDepends se puede usar para comprobar si las personas infringen las reglas)

(Al intentar acelerar las compilaciones de C++ he encontrado que FileMon es muy útil. Un proyecto en el que trabajé, el STL se agregó a un archivo de cabecera y mucho más lento. ¡Simplemente agregar STL al archivo de encabezado precompilado hizo una gran diferencia! Por lo tanto, rastrea tu tiempo de compilación e investiga cuándo es más lento)

+0

+1 para señalar el problema de C# con proyectos dependientes que necesitan una reconstrucción cuando solo cambia la implementación de una biblioteca. C++ hace un mejor trabajo al separar claramente la interfaz de la implementación, lo que la hace más adecuada para proyectos grandes. La inyección de dependencia es solo una solución ya que obliga a reescribir toda la base de código de manera compatible, es decir, es invasiva. –

3

También es mi observación que C# es significativamente más rápido de compilar que C++. Una de las principales razones es, por supuesto, las plantillas que no necesitan estar en los encabezados en C#, ya que no hay encabezados. Pero el uso intensivo de plantillas (principalmente cualquier biblioteca moderna de C++ como Boost) está acabando con el tiempo de compilación en C++.

Cuestiones relacionadas