2015-03-30 2 views
10

ghci के लिए, मैं सीमित कर सकते हैं जब मैं पूरे कार्यक्रम संकलन स्मृति GHCi द्वारामैं runghc के लिए आरटीएस विकल्प कैसे पास कर सकता हूं?

$ ghci +RTS -M10m -RTS 

उपयोग कर सकते हैं, मुझे लगता है मैं कैसे कर सकते हैं कर सकते हैं

$ ghc -rtsopts a.hs 

तो

$ ./a +RTS -M10m 

runghc a.hs के लिए? मैंने कई तरीकों की कोशिश की है, जैसे runghc a.hs +RTS -M10m, लेकिन उनमें से कोई भी काम नहीं कर रहा है। एकमात्र विकल्प मैं स्मृति सीमित हो सकती है

$ export GHCRTS='-M10m' 
$ runghc a.hs 

से था, लेकिन मैं यह केवल एक बार होना चाहते हैं, तो मैं runghc तर्क पारित करके यह कर पसंद करते हैं।


संपादित करें: मैं जाँच कर रहा हूँ विकल्प या काम कर रहा है नहीं निम्नलिखित रणनीति का प्रयोग (सिर्फ इसलिए कि मैं बेहतर तरीके पता नहीं है) या नहीं:

-- a.hs 
f x = f (f x) 
main = print $ seq (f 0) 0 

ओपन दो टर्मिनलों, एक top के लिए कोड निष्पादित करने के लिए कमांड और दूसरा। अगर निष्पादन "ढेर थक गया" कहता है, तो मैंने निष्कर्ष निकाला है कि -M[number]m काम कर रहा है। यदि निष्पादन जारी रहता है और बड़ी मात्रा में स्मृति का उपयोग करता है, तो मैं प्रक्रिया को मारता हूं और निष्कर्ष निकालता हूं कि यह सफल नहीं हुआ है।

+0

'runghc + RTS -M10m a.hs' या' runghc -rtsopts a.hs + RTS -M10m'? (बस अनुमान लगा रहा है) – Dogbert

+0

@ डोगबर्ट दोनों ने कोशिश की, और न ही काम किया। वैसे भी धन्यवाद :( – Yosh

+0

आप कैसे जांच रहे हैं कि ध्वज प्रोग्राम से सेट है या नहीं? – Dogbert

उत्तर

3

GHCRTS=... runghc ...chi के रूप में उपयोग करना एकमात्र तरीका है। जिस तरह से runghc इसकी कमांड लाइन का अर्थ है, +RTS को आरटीएस विकल्प के रूप में runghc (यदि यह अंत में है) या प्रोग्राम नाम के रूप में (यदि यह शुरुआत में है) के रूप में व्याख्या किया गया है। यह रनटाइम तक कभी नहीं पहुंचता है। आप इसे --RTS +RTS ... का उपयोग कर प्रोग्राम में पास करने के लिए मजबूर कर सकते हैं लेकिन फिर इसे प्रोग्राम तर्क के रूप में माना जाता है और यह अभी भी रनटाइम द्वारा नहीं देखा जाता है।

इसकी जांच करने के लिए, मैं ghc कि अपने तर्कों के निशान के लिए एक आवरण खोल स्क्रिप्ट लिखा था, और -f विकल्प के साथ runghc को यह पारित कर दिया।

एक फ़ाइल ghc-wrapper युक्त बनाएँ:

#!/bin/sh -x 
exec ghc "[email protected]" 

-x विकल्प /bin/sh बताता है हर पंक्ति पता लगाने के लिए। runghc के साथ इस का उपयोग करें:

$ runghc -f ./ghc-wrapper Hello.hs 
+ exec ghc -ignore-dot-ghci -x hs -e :set prog "Hello.hs" -e :main [] Hello.hs 
Hello, World! 

$ runghc -f ./ghc-wrapper Hello.hs +RTS -s 
+ exec ghc -ignore-dot-ghci -x hs -e :set prog "Hello.hs" -e :main [] Hello.hs 
Hello, World! 
    114,016 bytes allocated in the heap # runghc's heap, not Hello's 
    ... 

$ runghc -f ./ghc-wrapper Hello.hs --RTS +RTS -s 
+ exec ghc -ignore-dot-ghci -x hs -e :set prog "Hello.hs" -e :main ["+RTS","-s"] Hello.hs 
Hello, World! 

$ runghc -f ./ghc-wrapper -- +RTS -s -RTS Hello.hs 
+ exec ghc -ignore-dot-ghci -e :set prog "+RTS" -e :main ["-s","-RTS","Hello.hs"] +RTS 
+RTS:1:55: 
    Not in scope: `main' 
    Perhaps you meant `min' (imported from Prelude) 

क्या हम वास्तव में चाहते हैं runghc निष्पादित करने के लिए है:

$ ghc -ignore-dot-ghci -x hs +RTS -s -RTS -e ':set prog "Hello.hs"' -e ':main []' Hello.hs 
Hello, World! 
     80,654,256 bytes allocated in the heap 
     ... 

लेकिन वहाँ है कि क्योंकि runghc+RTS विशेष रूप से इलाज नहीं है निर्दिष्ट करने के लिए कोई रास्ता नहीं है।

संबंधित मुद्दे