Warum C++-Code zur Überprüfung der Collatz-Vermutung schneller ist als eine manuell geschriebene Assembler-Inline?
Hallo zusammen! Ich lerne C++ und Assembler und habe beschlossen, die Collatz-Vermutung (3n+1) für große Zahlen zu testen. Ich habe zwei Versionen des Codes geschrieben: eine in reinem C++ mit Optimierungen und eine zweite mit manueller Assembler-Inline für x86-64. Ich erwartete, dass Assembler schneller sein würde, aber ich habe das gegenteilige Ergebnis erhalten.
Hier ist mein C++-Code (kompiliert mit -O2 in GCC):
#include <iostream>
#include <cstdint>
int collatz_steps(uint64_t n) {
int steps = 0;
while (n != 1) {
if (n % 2 == 0) {
n /= 2;
} else {
n = 3 * n + 1;
}
steps++;
}
return steps;
}
int main() {
uint64_t max_n = 1000000;
for (uint64_t i = 1; i <= max_n; ++i) {
collatz_steps(i);
}
return 0;
}
Und hier die Version mit Assembler-Inline (verwende MSVC-Stil __asm):
int collatz_asm(uint64_t n) {
int steps = 0;
__asm {
mov rax, n
xor ecx, ecx ; st