इसे थोड़ा सा रेफैक्टर करना (मूल रूप से बाएं-गुना) बहुत बेहतर प्रदर्शन देता है और जीसी ओवरहेड को 8388600 बाइट फ़ाइल को थोड़ा सा पार्सिंग करता है।
{-# LANGUAGE BangPatterns #-}
module Main (main) where
import qualified Data.ByteString.Lazy as BL
import Data.Binary.Get
data Trade = Trade
{ timestamp :: {-# UNPACK #-} !Int
, price :: {-# UNPACK #-} !Int
, qty :: {-# UNPACK #-} !Int
} deriving (Show)
getTrade :: Get Trade
getTrade = do
timestamp <- getWord32le
price <- getWord32le
qty <- getWord16le
return $! Trade (fromIntegral timestamp) (fromIntegral price) (fromIntegral qty)
countTrades :: BL.ByteString -> Int
countTrades input = stepper (0, input) where
stepper (!count, !buffer)
| BL.null buffer = count
| otherwise =
let (trade, rest, _) = runGetState getTrade buffer 0
in stepper (count+1, rest)
main :: IO()
main = do
input <- BL.readFile "trades.bin"
let trades = countTrades input
print trades
और संबंधित रनटाइम आंकड़े। हालांकि आवंटन संख्याएं करीब हैं, फिर भी जीसी और अधिकतम ढेर आकार संशोधन के बीच काफी अलग हैं।
यहां सभी उदाहरण जीएचसी 7.4.1-ओ 2 के साथ बनाए गए थे।
मूल स्रोत, अत्यधिक ढेर अंतरिक्ष उपयोग के कारण के साथ + आरटीएस -K1G -RTS चलाएँ:
426,003,680 bytes allocated in the heap
443,141,672 bytes copied during GC
99,305,920 bytes maximum residency (9 sample(s))
203 MB total memory in use (0 MB lost due to fragmentation)
Total time 0.62s ( 0.81s elapsed)
%GC time 83.3% (86.4% elapsed)
डैनियल संशोधन:
357,851,536 bytes allocated in the heap
220,009,088 bytes copied during GC
40,846,168 bytes maximum residency (8 sample(s))
85 MB total memory in use (0 MB lost due to fragmentation)
Total time 0.24s ( 0.28s elapsed)
%GC time 69.1% (71.4% elapsed)
और इस पोस्ट:
290,725,952 bytes allocated in the heap
109,592 bytes copied during GC
78,704 bytes maximum residency (10 sample(s))
2 MB total memory in use (0 MB lost due to fragmentation)
Total time 0.06s ( 0.07s elapsed)
%GC time 5.0% (6.0% elapsed)
प्रोफाइलिंग के बारे में असली दुनिया हैकेल में एक अध्याय है, और कुछ प्रश्नों को टैग किया गया है [हैकेल] + [प्रदर्शन] so.com पर - शायद यह आपके लिए मदद की है यू। – epsilonhalbe
@epsilonhalbe धन्यवाद, मेरे पास अच्छी खोज थी और यह पैटर्न Data.Binary.Get के दस्तावेज़ों में से एक है। मुझे संदेह है कि यह 'लगभग ट्रेल रिकर्सन' समस्या है लेकिन इसे समझने के लिए यह थोड़ा सा है। –
यह डेटा के रूप में मुश्किल है। बाइनरी.गेट सख्त दिखाई देता है - मैंने बेहतर आलस्य पाने की कोशिश करने के बारे में पिछली टिप्पणी की है, लेकिन मैंने इसे हटा दिया है क्योंकि यह लागू नहीं था। डैनियल फिशर का जवाब आपको दिखाता है कि सख्त होने का बेहतर काम कैसे करें। –