Niedawno przechodziłem przez kilka prostych problemów związanych z projektem Eulera i rozwiązywanie ich w Ruby i C++. Ale dla Problem 14 co do domysłów Collatza, mój kod C++ działał przez około pół godziny, zanim go zakończyłem, jednak kiedy przetłumaczyłem kod na Ruby, rozwiązał go w dziewięć sekund.Dlaczego ten kod Ruby jest znacznie szybszy niż odpowiadający mu kod C++?
Ta różnica jest dla mnie niewiarygodna - zawsze przekonano mnie, że C++ jest prawie zawsze szybszy niż Ruby, szczególnie w przypadku procesów matematycznych.
Mój kod jest następujący.
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;
}
czas Run - Szczerze mówiąc, nie wiem, ale to naprawdę bardzo długi czas.
Ruby: czas
#!/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 - około 9 sekund.
Masz pojęcie, co się tutaj dzieje?
P.S. kod C++ działa znacznie szybciej niż kod Ruby, dopóki nie osiągnie 100 000.
Zmień, że 'endl' na' "\ n" ', ponieważ wykonuje spłukiwanie strumienia, a niebuforowane IO jest bardzo wolne. –
Jak skompilować C++? – selalerer
to zrobi, ale kiedy dojdzie do wyższych liczb, może to być nawet kilka minut między wydrukami, a różnica w endl i "\ n" staje się pomijalna –