我为Project Euler Q14编写了这两个解决方案,在组装和C++中。它们实现了相同的蛮力方法来测试Collatz猜想。组装解决方案组装在一起:
nasm -felf64 p14.asm && gcc p14.o -o p14
C++汇编如下:
g++ p14.cpp -o p14
大会,p14.asm
:
section .datafmt db "%d", 10, 0
global mainextern printf
section .text
main:mov rcx, 1000000xor rdi, rdi ; max ixor rsi, rsi ; i
l1:dec rcxxor r10, r10 ; countmov rax, rcx
l2:test rax, 1jpe even
mov rbx, 3mul rbxinc raxjmp c1
even:mov rbx, 2xor rdx, rdxdiv rbx
c1:inc r10cmp rax, 1jne l2
cmp rdi, r10cmovl rdi, r10cmovl rsi, rcx
cmp rcx, 2jne l1
mov rdi, fmtxor rax, raxcall printfret
C++,p14.cpp
:
#include <iostream>
int sequence(long n) {int count = 1;while (n != 1) {if (n % 2 == 0)n /= 2;elsen = 3*n + 1;++count;}return count;}
int main() {int max = 0, maxi;for (int i = 999999; i > 0; --i) {int s = sequence(i);if (s > max) {max = s;maxi = i;}}std::cout << maxi << std::endl;}
我知道编译器优化可以提高速度和一切,但我看不到有多少方法可以进一步优化我的汇编解决方案(以编程方式,而不是数学方式)。
C++代码每项使用模,每项使用除法,而汇编代码每项只使用一个除法。
但是组装的时间平均比C++解决方案长1秒。这是为什么?我主要是出于好奇问。
我的系统:64位Linux1.4 GHz Intel Celeron 2955U(Haswell微架构)。
g++
(未优化): avg 1272 ms.g++ -O3
: avg 578 ms.asm (div)
(原始):avg 2650 ms。asm (shr)
: avg 679 ms.-O3
平均81毫秒,-O0
平均305毫秒。