में pessimization होने के लिए मैं जाँच करने के लिए दो कार्य लिखा है, तो एक नंबर हास्केल में प्रधानमंत्री है:primality जांच परिवर्तन यह है कि अनुकूलन लग रहा था निकला हास्केल
prime :: Int -> Bool
prime 0 = False
prime 1 = False
prime 2 = True
prime n | even n = False
prime n = all (\x -> n `rem` x /= 0) [3,5..intSqrt]
where intSqrt = (floor . sqrt . fromIntegral) n
prime2 :: Int -> Bool
prime2 0 = False
prime2 1 = False
prime2 n = all (\x -> n `rem` x /= 0) [2..intSqrt]
where intSqrt = (floor . sqrt . fromIntegral) n
पहले संस्करण चाहिए, औसत में से आधे से गणना करने दूसरा, क्योंकि यहां तक कि संख्याएं भी छोड़ दी गई हैं, लेकिन यह पता चला है कि धीमा लगता है कि दूसरा संस्करण लगभग 2x तेज है! मैं टर्मिनल सत्र समय verbatim शामिल हैं।
प्रधानमंत्री 1 संस्करण:
$ ghc -O2 prime.hs
[1 of 1] Compiling Main (prime.hs, prime.o)
Linking prime ...
$ time ./prime
142913828922
real 0m4.617s
user 0m4.572s
sys 0m0.040s
अब मैं प्रोग्राम बदल prime2 संस्करण का उपयोग करने के लिए उपयोग:
$ ghc -O2 prime.hs
[1 of 1] Compiling Main (prime.hs, prime.o)
Linking prime ...
$ time ./prime
142913828922
real 0m2.288s
user 0m2.268s
sys 0m0.020s
$
main
में कोड बस है:
main :: IO()
main = print $ sum $ filter prime2 [1..2000000]
दूसरा संस्करण तेजी से क्यों है यदि यह दो बार मॉडोलस की संख्या करता है?
मैं इसे पुन: पेश नहीं कर सकता, 'प्राइम' 2x तेज है तो मेरे लिए 'प्राइम 2' (ghc-7.10.1) – Yuras
@ युरास क्या आप -ओ 2 के साथ संकलित हैं? (जीएचसी का मेरा संस्करण अलग है: 'ग्लासगो हास्केल कंपाइलर, संस्करण 7.6.3, चरण 2 जीएचसी संस्करण 7.6.3' – Caridorc
द्वारा बूट किया गया हां, मैं '-O2' के साथ संकलित कर रहा हूं। विभिन्न कंपाइलर संस्करण अलग-अलग व्यवहार की व्याख्या कर सकते हैं। – Yuras