Optimización de bucles

Los bucles se usan regularmente en todo el código fuente. Las propias construcciones de bucle se consideran a menudo como extrañas al cuerpo del bucle que realiza la tarea principal a mano, pero todas las partes de un bucle pueden afectar la velocidad a la que se ejecuta.
Hay varias cosas que puede ver para mejorar la velocidad de ejecución del bucle. Al considerar el tiempo de ejecución general de su programa, cualquier mejora de velocidad que pueda realizar en el código de bucle se multiplica por el número de iteraciones que realiza el bucle. Incluso pequeñas mejoras en un bucle pueden marcar una gran diferencia en general si el bucle se repite una gran cantidad de veces.
La variable de índice de bucle se puede acceder muchas veces durante cada iteración del bucle. Considere el siguiente fragmento de código que contiene un código de bucle típico, donde N se define como un valor arbitrario.


En este ejemplo anterior, el índice, i, tiene acceso tres veces por iteración, aunque este es un ejemplo simple de bucle. Es importante asegurarse de que la variable de índice de bucle tenga un tipo al que se pueda acceder de manera eficiente. Consulte Elección de un tipo de datos entero, que explica los tipos enteros de ancho mínimo más rápidos proporcionados por el compilador, o alternativamente para MPLAB® XC16 y XC32, utilice un tipo int y para MPLAB XC8 use un tipo de caracteres, si el número de iteraciones, N , puede ser retenido por estos tipos. Elija un tipo sin firmar si es posible, ya que esto podría conducir a una ejecución aún más rápida.

Vamos a reescribir el ciclo anterior utilizando una expresión de control diferente.


Aquí usamos un operador relacional fuerte (! =) En la expresión de control, no igual a N. Esta expresión está comprobando un único valor: i es igual a N o no lo es. Aunque el operador más débil menor de (<) es comúnmente utilizado por los programadores, el operador fuerte a menudo puede producir un código más pequeño y más rápido. Esto se debe a que, por lo general, es más fácil para el código verificar un único valor que para un rango de valores.

Para algunos conjuntos de instrucciones del dispositivo, la cuenta regresiva en el ciclo puede conducir a una ejecución más rápida. Si realiza una cuenta regresiva, verifique todas las expresiones del ciclo que usan el índice de ciclo. Asegúrese de que sean apropiados para el nuevo rango de valores que cubre el índice de ciclo, especialmente el último valor. En este ejemplo, el bucle terminará tan pronto como el índice de bucle alcance 0. La expresión de índice de matriz en el cuerpo del bucle se ha ajustado en consecuencia.


Busque otras optimizaciones que puedan acelerar la ejecución. Por ejemplo, las instancias en las que se evalúa una expresión varias veces se pueden factorizar cada iteración, se evalúan solo una vez y se almacenan para su reutilización. Pero antes de optimizar el código de bucle, de hecho cualquier código, vale la pena comprobar primero que el compilador que está utilizando no está realizando estas optimizaciones para usted. Sobre todo, asegúrese de que su código fuente sea fácil de leer e indique claramente la operación que desea.


Fuente: Optimizing Loops

Comentarios

Entradas más populares de este blog

Resistencias

Guía de introducción de XC8

Prefijos del sistema internacional de medidas