मैं concat
के अपने खुद के संस्करण, myConcat
को परिभाषित:अंतरिक्ष GHC दुभाषिया में केवल विशेष मामलों में रिसाव जब कर रही: concat <some list> !! n
module Eh where
myConcat [] = []
myConcat ([]:os) = myConcat os
myConcat ((x:xs):os) = x : myConcat (xs:os)
(!!!) :: [a] -> Int -> a
xs !!! n | n < 0 = error "negative index"
[] !!! _ = error "index too large"
(x:_) !!! 0 = x
(_:xs) !!! n = xs !!! (n-1)
अगर मैं GHC दुभाषिया में myConcat <some huge list> !! n
करते हैं, यह 300MB/s पर मेरी स्मृति चुरा लेता है, और मैं इसे मारने के लिए इससे पहले कि यह OOM बुलाने कर सकते हैं हत्यारा। यहां ध्यान दें कि मैं Eh
को "व्याख्या" के रूप में लोड करता हूं, मैं इसे लोड करने से पहले संकलित नहीं करता हूं।
code run in the GHC interpreter space leak? myConcat (repeat [1,2,3,4]) !! (10^8) Yes concat (repeat [1,2,3,4]) !! (10^8) No myConcat (repeat [1,2,3,4]) !!! (10^8) No concat (repeat [1,2,3,4]) !!! (10^8) No
अब अगर मैं संकलन Eh
(ghc --make -O2 Eh.hs
), और फिर दुभाषिया में लोड और इन परीक्षणों को फिर से चलाने, उनमें से कोई अंतरिक्ष रिसाव। वैसे ही अगर मैं दुभाषिया में उन्हें चलाने के बजाय प्रत्येक टेस्ट केस संकलित करता हूं।
क्या चल रहा है?
मैं जीएचसी 6.12.3 चला रहा हूं।
GHCi किस संस्करण का उपयोग कर रहे हैं? मेरी मशीन पर सभी चार मामलों में निरंतर स्मृति है। मेरे पास ghc '7.0.3' या ऐसा कुछ है। – fuz
मैं 6.12.3 चला रहा हूं। परीक्षण के लिए धन्यवाद! 6.12.3 पुराना है? –
इतना नहीं ... – fuz