El operador de módulo es costoso.
El operador de módulo (%) en varios idiomas es una operación costosa. En última instancia, cada operador/operación debe dar como resultado instrucciones del procesador. Algunos procesadores no tendrán instrucción de módulo a nivel de hardware, en tal caso los compiladores insertarán stubs (funciones predefinidas) para realizar el módulo. Afecta el rendimiento.
¿Existe una técnica simple para extraer el resto cuando un número se divide por otro número (divisor) que es potencia de 2? Un número que es una potencia exacta de 2 tendrá solo un bit establecido en su representación binaria. Considere las siguientes potencias de 2 y sus representaciones binarias
2 – 1
4 – 1
8 – 1
16 – 1
Tenga en cuenta esos ceros en color rojo, contribuyen al resto en la operación de división. Podemos obtener una máscara para esos ceros al disminuir el divisor en 1.
Generalizando el patrón anterior, un número que se puede escribir en forma de 2 n tendrá solo un conjunto de bits seguido de n ceros en el lado derecho de 1. Cuando un número (N) dividido por (2 n ), las posiciones de bits correspondientes a los ceros mencionados anteriormente contribuirán al resto de la operación de división. Un ejemplo puede dejarlo claro,
La operación de módulo sobre potencias exactas de 2 es simple y más rápida AND bit a bit. Esta es la razón por la que los programadores suelen hacer que la longitud del búfer sea potencia de 2.
Tenga en cuenta que la técnica funcionará solo para divisores que son potencias de 2.
Un ejemplo:
Implementación de cola circular (ring buffer) usando un arreglo. Omitir una posición en la implementación del búfer circular puede facilitar la distinción entre condiciones llenas y vacías . Cuando el búfer alcanza el TAMAÑO-1, debe volver a la posición inicial. La operación de reinicio puede ser una operación AND simple si el tamaño del búfer es una potencia de 2. Si usamos cualquier otro tamaño, necesitaríamos usar la operación de módulo.
Nota:
Según los comentarios de los expertos, la optimización prematura es un mal. Las técnicas de optimización proporcionadas son para ajustar su código después de finalizar la estrategia de diseño, el algoritmo, las estructuras de datos y la implementación. Recomendamos evitarlos al comienzo del desarrollo del código. La legibilidad del código es clave para el mantenimiento.
Gracias a Venki por escribir el artículo anterior. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA