2012-01-23 10 views
13

Si deseo obtener un mejor rendimiento de, digamos por ejemplo, MySQLdb, puedo compilarlo yo mismo y obtendré un mejor rendimiento porque no está compilado en i386, i486 o lo que sea, solo en mi CPU. Además, puedo elegir las opciones de compilación, etc. ... Ahora, me preguntaba si esto es cierto también para el software no habitual, como el compilador. Aquí viene la primera parte:Rendimiento del código compilado por el compilador compilado

  • ¿Compilará un compilador como el resultado de GCC en un mejor rendimiento? y la 2da parte:
  • ¿El código compilado por mi compilador compilado funcionará mejor?

(Sí, lo sé, puedo compilar mi compilador y de referencia ... pero tal vez ... alguien ya sabe la respuesta, y voy a compartirlo con nosotros =)

+0

_¡Las gafas! No hacen nada! _;) – Izkata

+0

Sí, les pregunté, pero están ocupados en el muro de escalada :-P – Oz123

+5

Yo dawg, he oído que te gustan los compiladores. – joshin4colours

Respuesta

14

En respuesta a su primera pregunta, casi con certeza sí. Las versiones binarias de gcc serán el "mínimo común denominador" y, si las compila con indicadores especiales más apropiados para su sistema, lo más probable es que sean más rápidos.

En cuanto a su segunda pregunta, no.

La salida del compilador será la misma independientemente de cómo la haya optimizado (a menos que tenga errores, por supuesto).

En otras palabras, incluso si totalmente llenos de seguridad de sus opciones del compilador al compilar gcc, hasta el punto en que su particular versión compilada de gcc toma una semana y media para compilar "Hello World", el actual "Hello World" el ejecutable debe ser idéntico al producido por el "mínimo común denominador" gcc (si usa los mismos indicadores).

+4

En cuanto a la segunda parte: incluso es común que la inicialización de un compilador se realice en 3 pasos: 1.) compilar el compilador utilizando el compilador existente (posiblemente mínimo, que no optimiza), 2.) compilar el compilador usando el binario producido en el paso # 1. (es decir compilarlo consigo mismo) y 3.) compilar el compilador con el compilador producido en el paso # 2. Los binarios producidos en los pasos # 2 y # 3 deben ser completamente idénticos (excepto por algunas marcas de tiempo incorporadas o cosas similares) y ese hecho se usa realmente para verificar si el compilador se compila correctamente. –

+0

wow, gracias por todas las respuestas chicos. Pensé que sería criticado por una pregunta "Trivial". Pero, por el contrario ... – Oz123

3

a.Bien, puede compilar el compilador en su sistema, y ​​tal vez se ejecute más rápido. como cualquier programa (Creo que generalmente no vale la pena, pero haz lo que quieras).

b. No. Incluso si compila el compilador en su computadora, su comportamiento no debería cambiar, por lo que el código que genera tampoco cambiará.

5

(1) Es posible. Si introduce una nueva optimización para su compilador y la vuelve a compilar con esta optimización incluida, es posible que el código compilado vuelva a funcionar mejor.

(2) No !!!! ¡Un compilador no puede cambiar la lógica del código! En su caso, la lógica del código es el código nativo producido al final. Entonces, si el compilador A_1 se compila usando el compilador A_2 o B, no tiene efecto en el código nativo producido por A_1 [aquí A_1, A_2 son los mismos compiladores, el índice es solo por claridad].

+3

+1 para la línea en negrita. De hecho, compilar un compilador no significa que haya agregado sus propias técnicas de optimización que son más rápidas. –

+1

@Shiplu: por supuesto, supone que ha seguido las reglas y no ha hecho nada tonto como un comportamiento indefinido :-) Por otra parte, un compilador es libre de emitir código diferente para eso incluso si _nothing_ ha cambiado. – paxdiablo

+0

-1 para la línea en negrita. Oz123 pidió no ser juzgado con demasiada dureza, pero obviamente no leyó la pregunta. – Codo

2

¿Compilará un compilador como el resultado de GCC en un mejor rendimiento?

Un programa compilado específicamente para la plataforma de destino en el que se utiliza generalmente tendrá un mejor rendimiento que un programa compilado para una plataforma genérica. ¿Por qué es esto? El conocimiento sobre el harware puede ayudar al compilador a alinear los datos para que sean compatibles con la memoria caché y elegir un orden de instrucciones que funcione bien con un pipeline de CPU.

El mayor beneficio se logra usualmente al aprovechar conjuntos de instrucciones específicas como SSE (en sus diversas versiones).

Por otro lado, debe preguntarse si un programa como GCC está realmente vinculado a la CPU (mucho más probable es que esté enlazado a IO) y ajustar su rendimiento de CPU proporciona un beneficio mensurable.

¿El código compilado por mi propio compilador compilado un mejor desempeño

Esperemos que no

! Permitir que un compilador optimice un programa nunca debe cambiar su comportamiento. No importa cómo haya compilado su GCC, debería compilar el código en los mismos binarios que una distribución binaria genérica de GCC.

Si el código compilado para la plataforma específica es más rápido que el compilador de código para una plataforma genérica, ¿por qué no enviamos todos los códigos en lugar de los binarios? Adivina qué, algunas distribuciones de Linux realmente siguen esta filosofía, como Gentoo. Y mientras lo hace, asegúrese de crear binarios enlazados estáticamente, el espacio en disco es tan barato hoy en día y le da al menos otro 0.001% de rendimiento.

Muy bien, eso fue un poco sarcástico. La razón por la que las personas distribuyen los binarios genéricos es bastante obvia: es geneir, el mínimo común denominador y funcionará en todas partes. Eso es una gran ventaja en términos de flexibilidad y amigabilidad para el usuario. Recuerdo que una vez que compilé Gnome para mi caja Gentoo, ¡me tomó uno o dos días! (Pero debe haber sido mucho más rápido ;-))

Por otro lado, hay ocasiones en las que desea obtener el mejor rendimiento posible y tiene sentido para construir y optimizar para las arquitcturas específicas.

0

GCC utiliza un bootstraping de tres pasos al construir desde la fuente. Básicamente compila la fuente tres veces para garantizar que las herramientas de compilación y el compilador se compilan con éxito. Este bootstraping se usa con fines de validación. Sin embargo, es posible utilizar la etapa 1 como punto de referencia para optimizar etapas posteriores. Debe crear GCC con make profiledbootstrap para usar esta optimización basada en perfil.

Este proceso de compilación basado en el perfil aumenta el rendimiento de "GCC", pero no el software compilado con él, como se señala en otras respuestas.

Cuestiones relacionadas