Gần đây tôi đã đi qua một số dự án Euler dễ dàng và giải quyết chúng trong Ruby và C++. Nhưng đối với Problem 14 liên quan đến giả thuyết Collatz, mã C++ của tôi tiếp tục trong khoảng nửa giờ trước khi tôi chấm dứt nó, mặc dù khi tôi dịch mã thành Ruby, nó đã giải quyết nó trong chín giây.Tại sao mã Ruby này nhanh hơn mã C++ tương đương?
Sự khác biệt đó là điều không thể tin được đối với tôi - tôi luôn được tin rằng C++ gần như luôn nhanh hơn Ruby, đặc biệt đối với quy trình toán học.
Mã của tôi như sau.
C++:
#include <iostream>
using namespace std;
int main()
{
int a = 2;
int b = 2;
int c = 0;
while (b < 1000000)
{
a = b;
int d = 2;
while (a != 4)
{
if (a % 2 == 0)
a /= 2;
else
a = 3*a + 1;
d++;
}
if (d > c)
{
cout << b << ' ' << d << endl;
c=d;
}
b++;
}
cout << c;
return 0;
}
Run thời gian - Thực sự tôi không biết, nhưng đây là thời điểm thực sự REALLY dài.
và Ruby:
#!/usr/bin/ruby -w
a = 0
b = 2
c = 0
while b < 1000000
a = b;
d = 2
while a != 4
if a % 2 == 0
a /= 2
else
a = 3*a + 1
end
d+=1
end
if d > c
p b,d
c=d
end
b+=1
end
p c
Run thời gian - khoảng 9 giây.
Bất kỳ ý tưởng gì đang xảy ra ở đây?
P.S. mã C++ chạy một giao dịch tốt hơn mã Ruby cho đến khi nó đạt đến 100.000.
Thay đổi 'endl' thành' "\ n" ', vì nó thực hiện một luồng của luồng và IO không bị nén là rất chậm. –
Làm thế nào để bạn biên dịch C++? – selalerer
sẽ làm, nhưng khi nó đạt đến con số cao hơn, nó có thể chỉ mất vài phút giữa các bản in và sự khác biệt của endl và "\ n" sẽ trở nên không thể bỏ qua –