Dovrebbero essere identici, poiché la costanza è un controllo in fase di compilazione.
Per provare a me stesso non c'erano stranezze, ho preso il codice di anon, l'ho modificato per usare clock_gettime
, aggiunto un ciclo esterno per evitare i bias di cache, e l'ho eseguito molte volte. I risultati sono stati sorprendentemente incoerenti - su e giù del 20% (non sono disponibili box liberi) - ma i tempi minimi per entrambi iterator
e const_iterator
erano praticamente identici.
Poi ho ottenuto il mio compilatore (GCC 4.5.2 O3) per generare uscita assemblaggio e visivamente rispetto i due cicli: identici (tranne che l'ordine di un paio di carichi di registro è stata invertita)
iterator
ciclo
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
ciclo:
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)
Nella tua misurazione, hai misurato il tempo di parete? –
Sì. Il codice è simile a quello che @Neil Butterworth ha pubblicato. Ho usato GetTickCount() per misurare il tempo –
Nel fare i test, dovresti prendere in considerazione possibili problemi come il caching che possono rendere più lento il test di prima esecuzione, ma possono anche renderlo più veloce (se hai popolato gli elementi del container più vicino a 'begin()' last). È una buona idea avere il programma configurato i dati, fare un passaggio con ogni iteratore (scartare questi tempi), quindi fare molti passaggi con ciascuno e riferire sui risultati). I valori minimi sono più significativi delle medie. Assicurati che i passaggi non vengano ottimizzati (ad esempio, usa gli iteratori per toccare alcune variabili volatili). –