हम आलसी घरों को सीधे उत्परिवर्तनीय और शुद्ध सूचियों का उपयोग करने के बीच आधा रास्ते पाने के लिए उपयोग कर सकते हैं। आपको एक पुनरावर्ती परिभाषा के लाभ मिलते हैं, लेकिन इसी कारण से आलस्य और मुक्केबाजी की कीमत का भुगतान करते हैं - हालांकि सूचियों के मुकाबले कम है। निम्नलिखित कोड का उपयोग करता कसौटी दो आलसी सरणी समाधान (मानक सरणियों का उपयोग कर, और वैक्टर) के साथ ही मूल सूची कोड और ऊपर डैनियल परिवर्तनशील uarray कोड का परीक्षण करने के लिए: के लिए मजबूर करने
module Main where
import Data.Bits
import Data.List
import Data.Word
import qualified Data.Vector as LV
import Data.Array.ST
import Data.Array.Unboxed
import qualified Data.Array as A
import Data.Array.Base
import Criterion.Main
gen :: Word32 -> Word32 -> Word32 -> Word32 -> Word32
gen a b c d = rotate (a `xor` b `xor` c `xor` d) 1
gss blkw = LV.toList v
where v = LV.fromList $ blkw ++ rest
rest = map (\i -> gen (LV.unsafeIndex v (i + 13))
(LV.unsafeIndex v (i + 8))
(LV.unsafeIndex v (i + 2))
(LV.unsafeIndex v i)
)
[0..79 - 14]
gss' blkw = A.elems v
where v = A.listArray (0,79) $ blkw ++ rest
rest = map (\i -> gen (unsafeAt v (i + 13))
(unsafeAt v (i + 8))
(unsafeAt v (i + 2))
(unsafeAt v i)
)
[0..79 - 14]
generateSchedule :: [Word32] -> [Word32]
generateSchedule blkw = take 80 ws
where
ws = blkw ++ zipWith4 gen (drop 13 ws) (drop 8 ws) (drop 2 ws) ws
gs :: [Word32] -> [Word32]
gs ws = elems (generateSched ws)
generateSched :: [Word32] -> UArray Int Word32
generateSched ws0 = runSTUArray $ do
arr <- unsafeNewArray_ (0,79)
let fromList i [] = fill i 0
fromList i (w:ws) = do
unsafeWrite arr i w
fromList (i+1) ws
fill i j
| i == 80 = return arr
| otherwise = do
d <- unsafeRead arr j
c <- unsafeRead arr (j+2)
b <- unsafeRead arr (j+8)
a <- unsafeRead arr (j+13)
unsafeWrite arr i (gen a b c d)
fill (i+1) (j+1)
fromList 0 ws0
args = [0..13]
main = defaultMain [
bench "list" $ whnf (sum . generateSchedule) args
,bench "vector" $ whnf (sum . gss) args
,bench "array" $ whnf (sum . gss') args
,bench "uarray" $ whnf (sum . gs) args
]
मैं -O2
साथ कोड संकलित और -funfolding-use-threshold=256
बहुत सारे इनलाइनिंग।
कसौटी मानक दर्शाते हैं कि वेक्टर समाधान थोड़ा बेहतर है, और सरणी समाधान थोड़ा बेहतर अभी भी, लेकिन वह अनबॉक्स्ड परिवर्तनशील समाधान अभी भी भारी बहुमत से जीत:
benchmarking list
mean: 8.021718 us, lb 7.720636 us, ub 8.605683 us, ci 0.950
std dev: 2.083916 us, lb 1.237193 us, ub 3.309458 us, ci 0.950
benchmarking vector
mean: 6.829923 us, lb 6.725189 us, ub 7.226799 us, ci 0.950
std dev: 882.3681 ns, lb 76.20755 ns, ub 2.026598 us, ci 0.950
benchmarking array
mean: 6.212669 us, lb 5.995038 us, ub 6.635405 us, ci 0.950
std dev: 1.518521 us, lb 946.8826 ns, ub 2.409086 us, ci 0.950
benchmarking uarray
mean: 2.380519 us, lb 2.147896 us, ub 2.715305 us, ci 0.950
std dev: 1.411092 us, lb 1.083180 us, ub 1.862854 us, ci 0.950
मैं कुछ बुनियादी रूपरेखा भी भाग गया, और ध्यान दिया कि आलसी/बॉक्स किए गए सरणी समाधान सूची समाधान से थोड़ा बेहतर थे, लेकिन फिर से अनबॉक्स किए गए सरणी दृष्टिकोण से काफी खराब।
मुझे अभी भी लगता है कि आपको सूचियों को पूरी तरह से मिटाना होगा। मध्यस्थ के रूप में नहीं, अपने डेटा को 'बाइटस्ट्रिंग' के रूप में इनपुट करें और डेटा का उपयोग करें। वेक्टर। स्टेट या कुछ ऐसे। जब इनपुट शब्दों की सूची होती है तो मुझे अनुकूलन में बहुत अधिक बिंदु नहीं दिखता है। यदि आप पूरी तरह से 'partcb' को अनलॉक करते हैं तो आपको इस' जेनरशेड्यूल 'फ़ंक्शन (' partab') की भी आवश्यकता नहीं होगी; यह अनियंत्रण में स्पष्ट (रेखांकित) होगा। इसके अलावा: आप इस में पर्याप्त प्रयास कर रहे हैं कि मैं लक्ष्य के रूप में उत्सुक हूं - क्या यह शिक्षा है या आप उत्पादन कोड में कार्यान्वयन का उपयोग करना चाहते हैं? यदि # 2, क्या 'क्रिप्टोश' से बचने का कोई कारण है? –
शिक्षा। मैं जानना चाहता हूं कि मैं स्वच्छ, बेवकूफ हास्केल लिख सकता हूं जो ऑप्टिमाइज़ेशन चाल का उपयोग किए बिना गति में तुलनीय है जो मुझे इच्छा है कि मैंने इसे सी में लिखा है। एसएचए 1 के मामले में, मुझे ऐसा लगता है कि ऐसा ही मामला है। मैंने [Data.Digest.Pure.SHA] के लिए स्रोत भी देखा (http://hackage.haskell.org/packages/archive/SHA/1.5.0.0/doc/html/src/Data-Digest-Pure-SHA .html)। यह बहुत अच्छा है - सी 4 कार्यान्वयन की गति 2-3x के भीतर। लेकिन यह ऐसा कोड नहीं है जिसे मैं लिखना चाहता हूं। – Ana
एफवाईआई मेरा पूरा, नवीनतम कोड [यहां] (https://gist.github.com/5a7c61e057c94f35b87b)। – Ana