2011-06-14 8 views
5

He escrito un método de referencia para probar mi programa C++ (que busca un árbol de juego), y me doy cuenta de que compilar con la opción "compilador LLVM 2.0" en XCode 4.0.2 me da un binario significativamente más rápido que si compilo con la última versión de clang ++ de MacPorts.¿Por qué obtengo un binario más rápido con Xvode's llvm vs. clang ++ desde MacPorts?

Si entiendo correctamente, estoy usando una interfaz de usuario de clang y de fondo en ambos casos. ¿Ha realizado Apple mejoras en su distribución clang/llvm para producir binarios más rápidos para Mac OS? No puedo encontrar mucha información sobre el proyecto.

Éstos son los puntos de referencia de mi programa produce para varios compiladores, todo ello utilizando -O3 optimización (mayor es mejor):

(Xcode) "gcc 4.2": 38.7 
(Xcode) "llvm gcc 4.2": 51.2 
(Xcode) "llvm compiler 2.0": 50.6 
g++-mp-4.6: 43.4 
clang++: 40.6 

Además, ¿cómo puedo compilar con el sonido metálico XCode/llvm está utilizando desde el terminal ? No puedo encontrar el comando.

EDITAR: Los puntajes que presento son "miles de juegos por segundo" que se calculan durante una ejecución lo suficientemente larga del programa. Las puntuaciones son muy consistentes en varias ejecuciones, y las mejoras algorítmicas recientes recientes me han dado aceleraciones de 1% - 5%, por ejemplo. Una aceleración del 25% de 40 a 50 es enorme para mi programa.

ACTUALIZACIÓN: No invocaba clang ++ desde la línea de comandos con -flto. Ahora cuando comparo clang ++ -O3 -flto a/Developer/usr/bin/clang ++ -O3 -flto desde la línea de comandos, los resultados están más cerca, pero el de Apple es aún un 6.5% más rápido.

Ahora, ¿cómo habilitar la optimización del tiempo de enlace para gcc? Cuando intento g ++ -flto me sale el siguiente error:

cc1plus: error: LTO support has not been enabled in this configuration 
+2

Si esos son milisegundos y no ejecutó la prueba, digamos, 100 millones de veces para calcular el promedio, entonces su punto de referencia es incorrecto. –

+1

@ Tamás: Dudo seriamente que sea milisegundos, dado que el compilador 'llvm 2.0' tiene una lectura más alta que 'clang ++' y el OP afirma que el primero es el más rápido de los dos. – ildjarn

+0

Probablemente tengas razón, revisé los valores y pensé que la diferencia es muy pequeña. –

Respuesta

2

de Apple LLVM compilador debe estar disponible en/desarrollador/usr/bin/ruido metálico.

No puedo pensar en ninguna razón particular por la que MacPorts clang ++ generaría un código más lento ... Verificaría si está pasando opciones de línea de comandos comparables. Una cosa que haría una gran diferencia es si está produciendo código de 32 bits con un compilador y código de 64 bits con el otro.

0

velocidad exacta de un algoritmo puede depender de todo tipo de cosas que están totalmente fuera de sus de y el poder del compilador. Puede tener un bucle donde el tiempo de ejecución depende de cómo se alinean exactamente las instrucciones en la memoria, de una manera que el compilador no pudo predecir. He visto casos en los que un ciclo podría ingresar a diferentes "estados" con diferentes tiempos de ejecución por iteración (por lo que después de un cambio de contexto, podría entrar en un estado en el que tomara 12 o 13 ciclos, de forma aleatoria). Esto puede ser una coincidencia.

Y es posible que esté utilizando diferentes bibliotecas, que es bastante posible el motivo. En MacOS X, están utilizando una implementación nueva y presumiblemente más rápida de std :: string y std :: vector, por ejemplo.

Cuestiones relacionadas