मैंने और C++ (ideone लिंक) दोनों में Project Euler's Challenge 14 के लिए कोड लिखा है। वे दोनों किसी भी गणना में पहले से किए गए किसी भी गणना को याद करते हैं।जीएचसी अनुकूलन: कोलाट्स अनुमान
क्रमशः ghc -O2
और g++ -O3
का उपयोग करके, सी ++ हास्केल संस्करण की तुलना में 10-15 गुना तेजी से चलता है।
जबकि मैं समझता हूं कि हास्केल संस्करण धीमा हो सकता है, और हैस्केल लिखने के लिए एक अच्छी भाषा है, यह कुछ अच्छा परिवर्तन जानना अच्छा होगा, जिसे मैं हास्केल संस्करण में तेज़ी से चलाने के लिए कर सकता हूं (आदर्श रूप से सी ++ संस्करण के 2 या 3 का कारक)?
हास्केल कोड यहाँ है:
import Data.Array
import Data.Word
import Data.List
collatz_array =
let
upperbound = 1000000
a = array (1, upperbound) [(i :: Word64, f i :: Int) | i <- [1..upperbound]]
f i = i `seq`
let
check_f i = i `seq` if i <= upperbound then a ! i else f i
in
if (i == 1) then 0 else (check_f ((if (even i) then i else 3 * i + 1) `div` 2)) + 1
in a
main =
putStrLn $ show $
foldl1' (\(x1,x2) (y1,y2) -> if (x2 >= y2) then (x1, x2) else (y1, y2)) $! (assocs collatz_array)
संपादित करें:
मैं अब भी अनबॉक्स्ड परिवर्तनशील सरणियों का उपयोग कर एक संस्करण किया है। यह अभी भी सी ++ संस्करण की तुलना में 5 गुना धीमा है, लेकिन एक महत्वपूर्ण सुधार है। कोड here पर विचार है।
मैं म्यूटेबल सरणी संस्करण में सुधार जानना चाहता हूं जो इसे सी ++ संस्करण के करीब लाता है।
बस FYI, '-fllvm' के साथ संकलन, मेरी मशीन पर ~ 10% द्वारा प्रदर्शन में सुधार करता है। –
आपकी 'seq' कोई फर्क नहीं पड़ता; आपके दोनों कार्य 'i' में सख्त हैं। 32-बिट प्लेटफ़ॉर्म पर 64-बिट अंकगणित पर जीएचसी काफी खराब था, लेकिन मुझे नहीं पता कि आप किस प्लेटफ़ॉर्म का उपयोग कर रहे हैं। – augustss
'div' का प्रयोग न करें, 'quot' का उपयोग करें। – augustss