7

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?

+2

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 –

+0

Pregunta muy interesante. Intenta leer http://en.wikipedia.org/wiki/Compiler_optimization –

+0

@Armen: lo siento si mi pregunta fue molesta, fue solo por curiosidad y no se puede encontrar en la red. –

Respuesta

9

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.

+0

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. –

+0

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

+0

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. –

5

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/

+1

Lo curioso es que deberías preocuparte por cosas de bajo nivel y seguir escribiendo row ++ en lugar de ++ fila: P –

+4

¿Qué tiene que ver su código de ejemplo para acceder al disco? – JeremyWeir

+4

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. –

-3

Las reglas de optimización:

  1. no practico
  2. 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.

+2

La pregunta no es sobre optimización manual, sino qué pueden hacer los compiladores y cómo lo hacen eso. – DerKuchen

+0

Hola, gracias por tu consejo, pero creo que estoy a punto de aprenderlo completamente, así que no quiero malinterpretarlo. –

+0

@DerKuchen: bueno, se trata de ambos. –

Cuestiones relacionadas