Todas las buenas respuestas.
Me refinaría la parte de "medida" del consejo. Realizo mediciones con el fin de cuantificar cualquier mejora que pueda hacer. Sin embargo, para buscando lo que necesita ser reparado (y ese es un propósito diferente), obtengo varias muestras de la pila de llamadas, manualmente.
Supongamos, por simplicidad, que el programa tarda 20 giga-ciclos en ejecutarse, cuando debería tomar 10. Si lo paro 10 veces al azar, entonces en 5 de esas ocasiones, más o menos, estará en uno de esos ciclos innecesarios. Puedo ver si el ciclo es necesario mirando cada capa de la pila de llamadas. Si se puede eliminar cualquier instrucción de llamada en cualquier nivel de la pila, entonces el ciclo es innecesario. Si tal instrucción aparece en varias pilas, eliminarla hará que acelere el programa, en una cantidad que es aproximadamente el porcentaje de muestras de la pila en la que se encuentra.
Cualquier instrucción que aparezca en varias pilas es sospechosa: cuantas más pilas hay, más sospechosas. Ahora, call _main
probablemente no sea uno que pueda eliminar, pero
foo.cpp:96 call std::vector::iterator:++
si aparece en varias pilas, es definitivamente un foco de atención.
Uno puede, por motivos de estilo, no querer para reemplazarlo, pero uno sabrá aproximadamente qué precio en rendimiento se está pagando para esa elección.
Por lo tanto, la optimización consiste en identificar a los sospechosos y encontrar la manera de reemplazarlos o eliminarlos.
La parte difícil (y lo he hecho muchas veces) es entender qué es necesario y qué no. Para eso, absorberás una comprensión de cómo y por qué se hacen las cosas en ese programa, de modo que si alguna actividad es un ciclo-cerdo, puedes saber cómo reemplazarla de manera segura.
Algunos cerdos de ciclo pueden ser fáciles de arreglar, pero se encontrará rápidamente con aquellos que no sabe cómo reemplazar de forma segura. Para eso, necesitas estar más familiarizado con el código.
Te ayudará si puedes elegir el cerebro de alguien que ya trabajó en el programa.
De lo contrario (suponiendo que el código es ~ 10^6 líneas, como he trabajado) puede obtener cierta aceleración con bastante facilidad, pero para ir más allá, puede llevar meses llegar a donde se siente cómodo cambios significativos.
¿debería simplemente dividir esta pregunta en varias? – Claudiu
Creo que es una buena pregunta como está. Es realmente una bola de conceptos que se tratan mejor como un solo paquete. –