Saltar al contenido

Repetir un bloque de código un número fijo de veces

Si encuentras algo que no entiendes puedes comentarlo y te ayudaremos lo mas rápido que podamos.

Solución:

Sus intentos de optimizar el bucle mediante el uso de alguna construcción (incluido cortar y pegar manualmente el código) para optimizar la velocidad de ejecución del bucle son desaconsejables. No lo hagas; probablemente “desoptimizaría” la velocidad de ejecución en su lugar.

En cualquier implementación de C ++ que haya encontrado (MSVC 6.0, 2003, 2005, 2010, varias versiones de GCC, varias versiones de Diab), hay absolutamente cero, lo siento, no hice hincapié en eso lo suficiente, CERO, tiempo involucrado en la asignación de un ciclo variable de conteo, asumiendo que se asignaron otras variables para la función en la que se asigna la variable de conteo de bucle. Para un ciclo simple que no realiza llamadas de función, es posible que la variable de conteo de ciclos nunca llegue a la memoria; puede mantenerse completamente en un solo registro de CPU durante toda su vida útil. Incluso si se almacena en la memoria, estaría en la pila de tiempo de ejecución, y el espacio para él (y cualquier otra variable local) se reclamaría de una sola vez en una sola operación, que no toma más o menos tiempo dependiendo de la cantidad de variables asignadas en la pila. Las variables locales, como la variable de contador de bucle, se asignan en la pila, y las asignaciones de pila son BARATAS, BARATAS, BARATAS, a diferencia de las asignaciones de montón.

Ejemplo de asignación de variable de contador de bucle en la pila:

for (int i=0; i<50; ++i) 
    ....

Otro ejemplo de asignación de variable de contador de bucle en la pila:

int i = 0;
for (; i<50; ++i) 
    ....

Ejemplo de variable de contador de bucle asignada en el montón (no hagas esto; es estúpido):

int* ip = new int;
for (*ip=0; *ip<50; ++(*ip)) 
    ....

delete ip;

Ahora, para abordar el problema de intentar optimizar su bucle copiando y pegando manualmente en lugar de usar un bucle y un contador:

Lo que está considerando hacer es una forma manual de desenrollar bucles. El desenrollado de bucles es una optimización que los compiladores a veces usan para reducir la sobrecarga involucrada en un bucle. Los compiladores pueden hacerlo solo si el número de iteraciones del bucle puede conocerse en el momento de la compilación (es decir, el número de iteraciones es una constante, incluso si la constante implica un cálculo basado en otras constantes). En algunos casos, el compilador puede determinar que vale la pena desenrollar el bucle, pero a menudo no lo desenrollará por completo. Por ejemplo, en su ejemplo, el compilador puede determinar que sería una ventaja de velocidad desenrollar el ciclo de 50 iteraciones a solo 10 iteraciones con 5 copias del cuerpo del ciclo. La variable de bucle seguiría estando allí, pero en lugar de hacer 50 comparaciones del contador de bucle, ahora el código solo tiene que hacer la comparación 10 veces. Es una compensación, porque las 5 copias del cuerpo del ciclo consumen 5 veces más espacio en el caché, lo que significa que cargar esas copias adicionales de las mismas instrucciones obliga al caché a desalojar (desechar) tantas instrucciones que ya están en el caché y que podría haber querido permanecer en el caché. Además, cargar esas 4 copias adicionales de las instrucciones del cuerpo del bucle desde la memoria principal lleva mucho, mucho más tiempo que simplemente tomar las instrucciones ya cargadas del caché en el caso de que el bucle no se haya desenrollado en absoluto.

Entonces, en general, a menudo es más ventajoso usar solo una copia del cuerpo del bucle y seguir adelante y dejar la lógica del bucle en su lugar. (Es decir, no desenrolle ningún bucle).

Sería perfectamente posible tener un repeat(x) como parte del lenguaje, pero no existe tal cosa por alguna razón: el diseño de C y C ++ sigue de alguna manera lo que pueden hacer los procesadores, y no estoy familiarizado con un solo procesador (he trabajado con aproximadamente 10 arquitecturas de procesador diferentes) que pueden hacer un "bucle tantas veces" sin algún tipo de "comprobación si alcanzamos el número".

Entonces, tendrá que escribir un código que verifique cuántas veces ha repetido algo (o cuántas veces queda por hacer; hay una instrucción x86 llamada "bucle" que hace precisamente eso: cuenta regresiva, y si el contador no es cero, salta al principio del bucle).

Si el compilador desea "desenrollar" un ciclo porque tiene un número constante de iteraciones, y decide "desenrollar esto es más rápido" [compilers decide these sort of things all the time, and often get it right], entonces el compilador bien puede hacerlo. Pero aún tiene que escribir código que "verifique".

Reseñas y puntuaciones del tutorial

Recuerda que tienes la opción de decir si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *