Deben ser idénticos, ya que la constness es una verificación en tiempo de compilación.
Para probarme a mí mismo que no había caprichos, tomé el código de anon, lo modifiqué para usar clock_gettime
, agregué un bucle externo para evitar sesgos en el almacenamiento en caché y lo ejecuté varias veces. Los resultados fueron sorprendentemente inconsistentes: subieron y bajó un 20% (no hay cajas inactivas disponibles), pero veces mínimas para ambos iterator
y const_iterator
fueron prácticamente idénticos.
entonces conseguí mi compilador (GCC 4.5.2 -O3) para generar salida de ensamblaje y visualmente comparado los dos bucles idénticos: (excepto que el orden de las cargas de un par de registro se invirtió)
iterator
bucle
call clock_gettime
movl 56(%esp), %esi
movl $10, %ecx
movl 60(%esp), %edx
.p2align 4,,7
.p2align 3
.L35:
cmpl %esi, %edx
je .L33
movl %esi, %eax .p2align 4,,7
.p2align 3
.L34:
addl (%eax), %ebx
addl $4, %eax
cmpl %eax, %edx
jne .L34
.L33:
subl $1, %ecx
jne .L35
leal 68(%esp), %edx
movl %edx, 4(%esp)
leal 56(%esp), %esi
movl $1, (%esp)
const_iterator
bucle:
movl 60(%esp), %edx
movl $10, %ecx
movl 56(%esp), %esi
.p2align 4,,7
.p2align 3
.L38:
cmpl %esi, %edx
je .L36
movl %esi, %eax
.p2align 4,,7
.p2align 3
.L37:
addl (%eax), %ebx
addl $4, %eax
cmpl %eax, %edx
jne .L37
.L36:
subl $1, %ecx
jne .L38
leal 68(%esp), %edx
movl %edx, 4(%esp)
leal 56(%esp), %esi
movl $1, (%esp)
En su medida, ¿midió el tiempo de pared? –
Sí. El código es similar a lo que @Neil Butterworth ha publicado. Utilicé GetTickCount() para medir el tiempo –
Al hacer las pruebas, debe tener en cuenta posibles problemas como el almacenamiento en caché que pueden hacer que la prueba de la primera ejecución sea más lenta, pero incluso puede hacerlo más rápido (si ha llenado los elementos del contenedor) más cerca de 'begin()' last). Es una buena idea hacer que el programa configure los datos, hacer un pase con cada iterador (descartar esos tiempos), luego hacer muchos pases con cada uno e informar sobre los resultados). Los valores mínimos son más significativos que los promedios. Asegúrese de que los pases no estén siendo optimizados (por ejemplo, use los iteradores para tocar algunas variables volátiles). –