Me encontré con esta pregunta cuando respondía a otra pregunta de chicos. ¿Cómo los compiladores optimizan el código? ¿Pueden las palabras clave como const, ... ayudar? Además del hecho con volátiles y funciones en línea y cómo optimizar el código todo por su cuenta!¿Cómo optimizan los compiladores nuestro código?
Respuesta
Los compiladores son libres de optimizar el código siempre que puedan garantizar que la semántica del código no se modifique.
Me gustaría sugerir a partir de la página de wikipedia Compiler optimization ya que hay muchos tipos diferentes de optimización que se realizan en diferentes etapas.
Como puede ver, los compiladores modernos son muy 'inteligentes' para optimizar el código (el código C compilado suele ser más rápido que el ensamblado a mano a menos que el programador realmente sepa cómo aprovechar todas las instrucciones y peculiaridades específicas del procesador). Como han dicho otros, primero escriba para mayor claridad sobre la base de un buen diseño.
los compiladores pueden hacer eso si saben en qué hardware se está ejecutando su código. a veces debería entrar la GPU, se equivocan. Recientemente escribí un código que usaba tanto cpu como gpu (cuda) y el error era solo esa simple optimización de O2. Cuando lo apagué, todo tenía sentido. –
Código @Green: Los compiladores también son software, por lo que a veces tienen errores. Pero para los compiladores maduros, la salida suele ser correcta y extremadamente rápida en comparación con lo que la mayoría de los programadores puedan escribir por sí mismos. – delnan
Código @Green: hay varios niveles de optimizaciones. Algunos son independientes de la máquina, otros no. La máquina dependiente puede no estar libre de errores, especialmente para la arquitectura joven, simplemente porque todavía no se han probado exhaustivamente. CUDA también trae una nueva dificultad: de repente hay partes del código que deberían optimizarse para la CPU y otras para la GPU. Ninguno de los compiladores de C++ que conozco se han destinado a optimizar para dos arquitecturas diferentes a la vez. –
Una cosa muy importante que puede hacer (más allá de lo que el compilador puede hacer por usted) es conocer el caché. Debido a que el acceso a la memoria es realmente costoso, la memoria caché intenta ayudarlo almacenando no solo los datos a los que accedió, sino también los elementos cercanos. Esta es la razón por foo
se ejecutará mucho más rápido que bar
:
array[ NUM_ROWS ][ NUM_COLS ];
foo()
{
int row, col;
int sum = 0;
// accesses the elements in the array continuously
for (row = 0; row < NUM_ROWS ; row++)
{
for (col = 0; col < NUM_COLS; col++)
{
sum += array[ row ][ col ];
}
}
}
bar()
{
int row, col;
int sum = 0;
// skips from row to row (big jumps that might miss the cache)
for (col = 0; col < NUM_COLS ; col++)
{
for (row = 0; row < NUM_ROWS; row++)
{
sum += array[ row ][ col ];
}
}
}
Editar: Otra cosa a tener en cuenta se repite la concatenación de cadenas. Hecho mal, esto puede hacer que el código que de otro modo se repite en las O(n)
realmente en O(n^2)
- ver un artículo sobre Joel on Software
Editar: s/disco/memoria/
Lo curioso es que deberías preocuparte por cosas de bajo nivel y seguir escribiendo row ++ en lugar de ++ fila: P –
¿Qué tiene que ver su código de ejemplo para acceder al disco? – JeremyWeir
conocer la memoria caché le ahorrará mucho más que ++ fila: P @jayrdub: implica una explicación de cómo la memoria * realmente * funciona en la máquina. Básicamente, 'array [row] [col]' es una llamada a la memoria principal que originalmente está almacenada en el disco duro. Debido a que el disco duro se mueve mucho más lento que la CPU, las computadoras almacenarán información en una 'caché' a la que es más fácil acceder. –
Las reglas de optimización:
- no practico
- sólo usuarios avanzados: no hacerlo todavía
Editar: La cita (y otra información, útil o no) se puede encontrar en el artículo CodingHorror: Hardware is cheap, programmers are expensive. Sin embargo, sería bueno encontrar el 'origen' de esta frase/cita.
La pregunta no es sobre optimización manual, sino qué pueden hacer los compiladores y cómo lo hacen eso. – DerKuchen
Hola, gracias por tu consejo, pero creo que estoy a punto de aprenderlo completamente, así que no quiero malinterpretarlo. –
@DerKuchen: bueno, se trata de ambos. –
- 1. ¿Pueden los compiladores de C++ eliminar automáticamente el código duplicado?
- 2. ¿Los compiladores modernos optimizan la operación x * 2 a x << 1?
- 3. ¿Los compiladores de C++ optimizan el paso por referencia de los parámetros de POD para pasar por copia?
- 4. ¿Cómo puedo indexar nuestro código fuente interno?
- 5. Pregunta sobre los compiladores y cómo funcionan
- 6. ¿Cuándo compilan los compiladores el código en C++?
- 7. compiladores + referencias entre clases: ¿cómo hace javac rápidamente lo que los compiladores C++ hacen lentamente?
- 8. ¿Cuán profundo funcionan los compiladores en línea?
- 9. Conectando a los compiladores de Java
- 10. ¿Cómo se implementan las clases en los compiladores
- 11. Haskell a los compiladores de Javascript?
- 12. ¿Cómo saben los compiladores dónde encontrar #include <stdio.h>?
- 13. ¿Cómo funcionan realmente los programas/compiladores/intérpretes de clojure?
- 14. JavaScript "compiladores"
- 15. ¿Cómo se optimizan los parámetros enteros (y otros espacios de parámetros discontinuos) en R?
- 16. compiladores JIT para matemática
- 17. ¿A qué nivel el compilador de C# o JIT optimizan el código de la aplicación?
- 18. Compatibilidad Dll entre compiladores
- 19. Comprender los compiladores de C++ desde una perspectiva Java/C#
- 20. ¿Cómo agregar nuestro propio servicio de sistema en Android Framework?
- 21. Análisis semántico en compiladores
- 22. ¿Cómo podemos utilizar cualquier biblioteca C dentro de nuestro código C++?
- 23. Compiladores para Haskell
- 24. ¿Se les permite a los compiladores eliminar infinitos bucles?
- 25. C struct alineación y portabilidad en los compiladores
- 26. comportamiento diferente de los compiladores con la asignación de gama
- 27. AS3 a compiladores JS
- 28. Compiladores compatibles con C11
- 29. Mejorando nuestro informe de errores de javascript
- 30. ¿Los compiladores de producción usan generadores de analizadores?
Este es mi segundo día en stackoverflow, pero ya veo el tema de optimización de const por tercera vez ... ¿Por qué los programadores están tan obsesionados con la optimización, especialmente cuando en la mayoría de los casos no es necesaria? Esto está destinado a ser un engaño –
Pregunta muy interesante. Intenta leer http://en.wikipedia.org/wiki/Compiler_optimization –
@Armen: lo siento si mi pregunta fue molesta, fue solo por curiosidad y no se puede encontrar en la red. –