Su pregunta no es lo suficientemente clara como para dar una respuesta remotamente precisa, pero creo que entiendo hacia dónde se dirige. Los datos sobre los que está iterando son lo suficientemente grandes como para que, antes de llegar al final, empiece a desalojar los datos para que la segunda vez (segundo ciclo) pueda iterar sobre ellos, si no todos tendrán que leerse nuevamente.
Si los dos bucles se unieron para que cada elemento/bloque se obtenga para la primera operación y luego ya esté en caché para la segunda operación, no importa qué tan grande sea la información relativa al caché, si no todos las segundas operaciones tomarán sus datos del caché.
Varias cosas como la naturaleza de la memoria caché, el bucle que es desalojado por los datos que se obtienen y los datos de desalojo pueden causar algunos errores en la segunda operación. En una PC con un sistema operativo, se producirán muchos desalojos con otros programas que reciben bloqueos de tiempo. Pero asumiendo un mundo ideal, la primera operación en el índice i de los datos lo recuperará de la memoria, la segunda operación lo tomará de la memoria caché.
El ajuste de una memoria caché es difícil en el mejor de los casos. Demuestro regularmente que incluso con un sistema integrado, sin interrupciones, una sola tarea, el mismo código fuente. El tiempo/desempeño de ejecución puede variar dramáticamente simplemente cambiando las opciones de optimización del compilador, cambiando compiladores, ambas marcas de compiladores o versiones de compiladores, gcc 2.x vs 3.x vs 4.x (gcc no necesariamente produce código más rápido con versiones más nuevas por cierto) (y un compilador que es bastante bueno en muchos objetivos no es realmente bueno en ningún objetivo en particular). El mismo código Los diferentes compiladores u opciones pueden cambiar el tiempo de ejecución varias veces, 3 veces más rápido, 10 veces más rápido, etc. Una vez que ingresas a las pruebas con o sin un caché, se vuelve aún más interesante. Agregue un solo nop en su código de inicio para que todo su programa mueva una instrucción en la memoria y sus líneas de caché ahora lleguen a diferentes lugares. Misma compilación del mismo código. Repita esto con dos nops, tres nops, etc. Mismo compilador, mismo código que puede ver decenas de porcentajes (para las pruebas que realicé ese día con ese compilador) las diferencias son cada vez mejores. Eso no significa que no puedas sintonizar un caché, solo significa que tratar de descubrir si tu afinación te ayuda o duele puede ser difícil. La respuesta normal es simplemente "cronometrar y ver", pero eso ya no funciona, y es posible que obtengas excelentes resultados en tu computadora ese día con ese programa con ese compilador. Pero mañana, en su computadora o cualquier otro día en otra computadora, puede estar haciendo las cosas más lentamente, no más rápido. Debe comprender por qué este o aquel cambio lo hizo más rápido, tal vez no tuvo nada que ver con su código, su programa de correo electrónico puede haber estado descargando una gran cantidad de correo en segundo plano durante una prueba y no durante la otra.
Suponiendo que haya entendido bien su pregunta, creo que, en general, el bucle único es más rápido.
Dado que la pregunta era demasiado vaga, creo que su respuesta es LA respuesta aquí. Gracias. – amn