I've seen a difference in the performance of
std.algorithm.reverse applied on an array compared to home-made
code, so I have written a little test.
Below you see the code, and the asm of the functions, compiled
with DMD 2.060, 32 bit (-O -release -inline).
Feel free to recompile the code yourself to see if I have done
some mistake :-)
------------------------------
import core.stdc.stdio: printf;
import std.algorithm: reverse;
void reverseArr(T)(T[] arr) {
for (auto x = arr.ptr, y = &arr[$ - 1]; x < y; ) {
auto aux = *x;
*x++ = *y;
*y-- = aux;
}
}
void main() {
auto a = [10, 20, 30, 40];
foreach(x; a) printf("%d ", x); printf("\n");
a.reverseArr();
foreach(x; a) printf("%d ", x); printf("\n");
a.reverse();
foreach(x; a) printf("%d ", x); printf("\n");
}
------------------------------
reverseArr:
push EBX
mov ECX,0Ch[ESP]
mov EBX,0Ch[ESP]
push ESI
mov ESI,0Ch[ESP]
lea ESI,-4[ESI*4][ECX]
cmp ECX,ESI
jae L2B
L19: mov EAX,[EBX]
mov EDX,[ESI]
mov [EBX],EDX
add EBX,4
mov [ESI],EAX
add ESI,0FFFFFFFCh
cmp EBX,ESI
jb L19
L2B: pop ESI
pop EBX
ret 8
-------------------
std.algorithm.reverse:
L0: sub ESP,020h
push EBX
push ESI
push EDI
cmp dword ptr 030h[ESP],0
je LE1
L11: cmp dword ptr 030h[ESP],0
mov EAX,030h[ESP]
mov EDX,034h[ESP]
mov 018h[ESP],EAX
mov 01Ch[ESP],EDX
jne L32
mov EAX,022Dh
call near ptr _D3std9algorithm7__arrayZ
L32: mov EAX,030h[ESP]
mov EDX,034h[ESP]
mov 024h[ESP],EDX
mov ECX,030h[ESP]
lea EDX,-1[ECX]
mov 020h[ESP],EAX
cmp EDX,ECX
mov 010h[ESP],EDX
jb L5E
mov EAX,0258h
call near ptr _D3std9algorithm7__arrayZ
L5E: mov ECX,01Ch[ESP]
mov EBX,030h[ESP]
mov EDX,024h[ESP]
lea EBX,-4[EBX*4][EDX]
mov ESI,[ECX]
mov EDX,[EBX]
mov [ECX],EDX
mov ECX,030h[ESP]
cmp ECX,ECX
mov [EBX],ESI
ja L86
cmp ECX,1
jae L90
L86: mov EAX,0173h
call near ptr _D3std9algorithm7__arrayZ
L90: mov EDX,034h[ESP]
mov EDI,010h[ESP]
mov 030h[ESP],EDI
add EDX,4
mov 034h[ESP],EDX
cmp dword ptr 030h[ESP],0
je LE1
mov EBX,030h[ESP]
lea ECX,-1[EBX]
cmp ECX,EBX
mov 014h[ESP],ECX
jbe LC6
mov EAX,01E8h
call near ptr _D3std9algorithm7__arrayZ
LC6: mov ESI,014h[ESP]
mov EDX,034h[ESP]
mov 030h[ESP],ESI
mov 034h[ESP],EDX
cmp dword ptr 030h[ESP],0
jne L11
LE1: pop EDI
pop ESI
pop EBX
add ESP,020h
ret 8
------------------------------
Bye,
bearophile