मैं Project Euler में हास्केल सीखने के तरीके के रूप में समस्याओं के माध्यम से काम कर रहा हूं, और मुझे लगता है कि संकलित होने पर भी, मेरे प्रोग्राम तुलनात्मक सी संस्करण की तुलना में बहुत धीमे हैं। मेरे हास्केल कार्यक्रमों को तेज़ करने के लिए मैं क्या कर सकता हूं?इस हास्केल प्रोग्राम के प्रदर्शन में सुधार कैसे करें?
उदाहरण के लिए, Problem 14 करने के लिए अपने जानवर बल समाधान है:
import Data.Int
import Data.Ord
import Data.List
searchTo = 1000000
nextNumber :: Int64 -> Int64
nextNumber n
| even n = n `div` 2
| otherwise = 3 * n + 1
sequenceLength :: Int64 -> Int
sequenceLength 1 = 1
sequenceLength n = 1 + (sequenceLength next)
where next = nextNumber n
longestSequence = maximumBy (comparing sequenceLength) [1..searchTo]
main = putStrLn $ show $ longestSequence
जो चारों ओर 220 सेकंड लेता है, एक "बराबर" जानवर बल सी संस्करण केवल 1.2 सेकंड लेता है।
#include <stdio.h>
int main(int argc, char **argv)
{
int longest = 0;
int terms = 0;
int i;
unsigned long j;
for (i = 1; i <= 1000000; i++)
{
j = i;
int this_terms = 1;
while (j != 1)
{
this_terms++;
if (this_terms > terms)
{
terms = this_terms;
longest = i;
}
if (j % 2 == 0)
j = j/2;
else
j = 3 * j + 1;
}
}
printf("%d\n", longest);
return 0;
}
मैं क्या गलत कर रहा हूं? या क्या मुझे लगता है कि हास्केल सी की गति तक भी पहुंच सकता है?
(मैं जीसीसी-ओ 2 के साथ सी संस्करण संकलित कर रहा हूं, और ghc --make -O के साथ हास्केल संस्करण)।
आपका 'हस्ताक्षरित लंबा' केवल 32-बिट लंबा हो सकता है। उचित तुलना के लिए, 'हस्ताक्षरित लंबे समय तक' या 'uint64_t' का उपयोग करें। – kennytm
@ केनीटीएम - उचित बिंदु - मैं 32-बिट उबंटू पर परीक्षण कर रहा था जहां 64-बिट्स का लंबा समय होता है। – stusmith
@ स्टुस्मिथ: मैं देखता हूं। यह ठीक है तो। – kennytm