Chyba wszyscy słyszeliście o "problemie z zamianą"; SO jest pełne pytań na ten temat. Wersja wymiany bez użycia trzeciej zmiennej jest często uważana za szybszą, ponieważ, cóż, masz jedną zmienną mniej. Chciałem wiedzieć, co dzieje się za kurtyną i napisał dwie następujące programy:Zmienna zamiana zi bez zmiennej pomocniczej - która jest szybsza?
int main() {
int a = 9;
int b = 5;
int swap;
swap = a;
a = b;
b = swap;
return 0;
}
i wersję bez zmiennej trzecie:
int main() {
int a = 9;
int b = 5;
a ^= b;
b ^= a;
a ^= b;
return 0;
}
I wygenerowany kod montaż przy użyciu szczęk i dostał to dla pierwsza wersja (która wykorzystuje trzeciej zmiennej):
...
Ltmp0:
movq %rsp, %rbp
Ltmp1:
movl $0, %eax
movl $0, -4(%rbp)
movl $9, -8(%rbp)
movl $5, -12(%rbp)
movl -8(%rbp), %ecx
movl %ecx, -16(%rbp)
movl -12(%rbp), %ecx
movl %ecx, -8(%rbp)
movl -16(%rbp), %ecx
movl %ecx, -12(%rbp)
popq %rbp
ret
Leh_func_end0:
...
a to dla drugiej wersji (które nie korzysta z trzeciej zmiennej):
...
Ltmp0:
movq %rsp, %rbp
Ltmp1:
movl $0, %eax
movl $0, -4(%rbp)
movl $9, -8(%rbp)
movl $5, -12(%rbp)
movl -12(%rbp), %ecx
movl -8(%rbp), %edx
xorl %ecx, %edx
movl %edx, -8(%rbp)
movl -8(%rbp), %ecx
movl -12(%rbp), %edx
xorl %ecx, %edx
movl %edx, -12(%rbp)
movl -12(%rbp), %ecx
movl -8(%rbp), %edx
xorl %ecx, %edx
movl %edx, -8(%rbp)
popq %rbp
ret
Leh_func_end0:
...
Druga jest dłuższa, ale nie wiem zbyt wiele na temat kodu zespołu, więc nie mam pojęcia, czy to oznacza, że jest wolniejsza, więc chciałbym usłyszeć opinię kogoś bardziej kompetentnego na ten temat.
Która z powyższych wersji zmiennej swap jest szybsza i zajmuje mniej pamięci?
Aby dowiedzieć się, który jest szybszy, dlaczego nie porównujesz go? –
Nie wiedziałbym, jak zmierzyć użycie pamięci oraz jestem również zainteresowany przyczynami tego problemu. – shutefan
Nie wygląda na to, że kompilowano przy włączonych optymalizacjach. W tym zgromadzeniu jest dużo puchu. –