Они должны быть идентичными, поскольку константа - это проверка времени компиляции.
Чтобы доказать, что у меня не было причуд, я взял код анона, изменил его, чтобы использовать clock_gettime
, добавил внешний цикл, чтобы избежать пристрастий к кешированию, и запускал его много раз. Результаты были неожиданно несогласованными - вверх и вниз на 20% (без свободных ящиков) - но минимум для обоих iterator
и const_iterator
были практически идентичными.
тогда я получил мой компилятор (GCC 4.5.2 -O3) для генерации выход сборки и визуально сравнить эти две петли: идентичны (за исключением того, порядка двух регистров нагрузок было отменено)
iterator
петли
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
цикл:
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)
В ваших измерениях вы измеряли время на стене? – 2009-04-16 11:05:45
Да. Код похож на то, что @Neil Butterworth опубликовал. Я использовал GetTickCount() для измерения времени. –
При выполнении ваших тестов вы должны учитывать возможные проблемы, такие как кеширование, которые могут легко сделать первый запуск более медленным, но могут даже ускорить его выполнение (если вы случайно заполнили элементы контейнера ближе к 'begin()' last). Это хорошая идея, чтобы программа настраивала данные, делала пропуск с каждым итератором (отбрасывала эти тайминги), затем делала много проходов с каждым и сообщала о результатах). Минимальные значения более значимы, чем средние. Убедитесь, что пропуски не оптимизированы (например, используйте итераторы, чтобы коснуться некоторых изменчивых переменных). –