Pregunta

Hemos estado analizando las versiones 3.2.3 y 4.2.4 de g++.Con 4.2.4, las mejoras de rendimiento en parte de nuestro código base son significativas.

He intentado buscar en base de datos gcc buzilla No encontré pistas sobre qué errores pudieron haber tenido una mejora tan dramática, pero no encontré ningún error individual que se destacara como candidato.

¿Son las mejoras el resultado de muchos pequeños cambios que poco a poco han ido surtiendo efecto?¿O hubo, por ejemplo, un conjunto de cinco mejoras principales que podrían haber marcado la diferencia?

Para algunos antecedentes, nuestra base de código hace un buen uso de los algoritmos y contenedores STL, así como de las características de C++, como la palabra clave 'inline'.

¿Fue útil?

Solución

En mi experiencia, 3.4 es donde el rendimiento básicamente alcanzó su punto máximo;En realidad, 4.2 es más lento que 3.4 en mi proyecto, siendo 4.3 el primero en igualar aproximadamente el rendimiento de 3.4.4.4 es ligeramente más rápido que 3.4.

Hay algunos casos específicos que he encontrado en los que versiones anteriores de gcc hacían algunas cosas increíblemente retrasadas en el código: había una función particular que pasaba de 128 a 21 relojes de 3.4 a 4.3, pero obviamente era un caso especial ( era un bucle corto donde la adición de sólo unas pocas instrucciones innecesarias perjudicaba enormemente el rendimiento).

Yo personalmente uso 3.4 solo porque se compila mucho más rápido, lo que hace que las pruebas sean mucho más rápidas.También trato de evitar las últimas versiones porque parecen tener hábitos desagradables de compilar mal el código;--march core2 en versiones recientes de gcc provoca errores de segmentación en mi programa, por ejemplo, porque emite código autovectorizado que intenta realizar accesos alineados en direcciones no alineadas.

Sin embargo, en general las diferencias rara vez son grandes;3-5% es el absoluto mayoría Lo he visto en términos de cambio de rendimiento.

Ahora, tenga en cuenta que esto es C;las cosas pueden ser diferentes en C++.

Otros consejos

Creo que el optimizador fue completamente reelaborado en la serie gcc4.Vea esta página, por ejemplo, sobre vectorización:

http://gcc.gnu.org/projects/tree-ssa/vectorization.html

Para obtener información, una vez hice una prueba comparativa de c[i] = a[i] + b[i] con matrices dinámicas, matrices estáticas y std::vector y fue el std::vector el más rápido (con gcc 4.1).30% de diferencia en rendimiento.

Las transmisiones eran muy lentas en 3.3 y se volvieron mucho más rápidas en 3.4.(mensaje en la lista de correo de gcc) Apuesto a que otras cosas también mejoraron.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top