Rolling up loops.
En serio, la última vez que necesité hacer algo como esto fue en una función que requirió el 80% del tiempo de ejecución, por lo que valía la pena tratar de micro-optimizar si podía obtener un aumento notable en el rendimiento.
Lo primero que hice fue enrollar el circuito. Esto me dio un aumento de velocidad muy significativo. Creo que esto era una cuestión de localidad de caché.
Lo siguiente que hice fue agregar una capa de direccionamiento indirecto, y poner un poco más de lógica en el ciclo, lo que me permitió recorrer solo las cosas que necesitaba. Esto no fue un aumento de velocidad, pero valió la pena hacerlo.
Si va a micro-optimizar, necesita tener una idea razonable de dos cosas: la arquitectura que está usando en realidad (que es muy diferente de los sistemas con los que crecí, al menos para micro- fines de optimización), y lo que el compilador hará por usted.
Muchas de las micro-optimizaciones tradicionales intercambian espacio por tiempo. Hoy en día, usar más espacio aumenta las posibilidades de que falte un caché, y ahí va tu desempeño. Además, muchos de ellos ahora los hacen los compiladores modernos y, por lo general, son mejores de lo que probablemente puedas hacer.
Actualmente, debe (a) hacer un perfil para ver si necesita micro-optimizar, y luego (b) tratar de intercambiar el cálculo por espacio, con la esperanza de mantener tanto como sea posible en el caché. Finalmente, realice algunas pruebas para saber si ha mejorado las cosas o las ha estropeado. Los compiladores y los chips modernos son demasiado complejos para que pueda mantener un buen modelo mental, y la única forma en que sabrá si una optimización funciona o no es poner a prueba.
"... de lo que puedas" <- caso general. En algunas instancias específicas (como algoritmos, DSP, etc.), un humano puede codificar una rutina de C que parece bastante extraña, pero una vez compilada, genera un mejor ensamblaje para el propósito específico que el compilador. –
Principalmente debido al hecho de que incluso grandes optimizaciones del compilador solo miran ciertos tipos de optimización y secciones más pequeñas de código optimizable. Una vez que comprenda el compilador y el ensamblado, podrá optimizar a mano trozos de código mucho más grandes que el compilador no podría mejorar. –
... pero estoy partiendo los pelos: pocas personas necesitarían hacer esto. Es divertido ver cómo un compilador ha convertido una sección de código en ensamblado: algunas de las optimizaciones del compilador son bastante intrincadas e impares hasta que realmente lo estudias. –