为什么用于验证考拉兹猜想的C++代码比手写的汇编运行得更快?
我正在学习C++和x86汇编,并决定编写一个程序来验证考拉兹猜想(3n+1)。思路很简单:取一个数,如果是偶数就除以2,如果是奇数就乘以3再加1。需要计算需要多少步才能到达1。
首先,我写了C++代码:
```cpp
int collatz(int n) {
int steps = 0;
while (n != 1) {
if (n % 2 == 0)
n /= 2;
else
n = 3 * n + 1;
steps++;
}
return steps;
}
```
然后,我手动编写了汇编版本,使用x86-64指令,以为它会更快:
```asm
collatz_asm:
xor eax, eax ; steps = 0
.loop:
cmp edi, 1
je .done
test edi, 1
jnz .odd
shr edi, 1 ; 偶数:n /= 2
inc eax
jmp .loop
.odd:
lea edi, [edi*2+edi+1] ; n = 3*n + 1
inc eax
jmp .loop
.done:
ret
```
但当我测量大数(例如从1到10百万)的性能时