2015-02-11 6 views
10

सी से बुलाए जाने वाले हास्केल फ़ंक्शन को निर्यात करते समय, हास्केल का कचरा कब एकत्र किया जाता है? यदि सी main का मालिक है तो हैस्केल में अगली कॉल की भविष्यवाणी करने का कोई तरीका नहीं है। सिंगल थ्रेडेड हास्केल या समानांतर जीसी के बिना चलने पर यह सवाल विशेष रूप से प्रासंगिक है।सी से हास्केल निर्यात को कॉल करते समय कचरा कलेक्टर कब चलाता है?

+0

यदि आप किसी विशिष्ट विदेशी निर्यात या निर्यात के बारे में चिंतित हैं तो आप एक ['performGC'] जोड़ सकते हैं (http://hackage.haskell.org/package/base-4.7.0.2/docs/System-Mem.html #v: performGC) 'Addr' लौटने से पहले। – Cirdec

+0

@Cirdec क्या 'Addr'? –

+5

आईआईआरसी, कचरा संग्रह हर बार चलाने का मौका मिलता है जब हास्केल कोड कुछ आवंटित करता है। यदि आपका प्रोग्राम अक्सर हास्केल में कॉल करता है, तो यह पर्याप्त होना चाहिए। अन्यथा, यदि आप हास्केल को बहुत अधिक समय तक स्मृति बनाए रखने की चिंता करते हैं, तो आप सी – chi

उत्तर

2

जब आप ghc क्रम प्रारंभ, आप RTS झंडे इसे करने के लिए argc के माध्यम से गुजरती हैं और argv like so कर सकते हैं:

RtsConfig conf = defaultRtsConfig; 
    conf.rts_opts_enabled = RtsOptsAll; 
    hs_init_ghc(&argc, &argv, conf); 

यह आपको देता है set options, उदाहरण के लिए एक छोटे अधिकतम ढेर आकार को ठीक करने या एक संघनन एल्गोरिथ्म का उपयोग करने के आवंटन को कम करने के लिए नर्सरी पर। इसके अलावा, ध्यान दें कि एक निष्क्रिय जीसी है जिसका अंतराल सेट किया जा सकता है (या अक्षम), और यदि आप थ्रेडेड रनटाइम को लिंक करते हैं, तो यह चलाना चाहिए कि आप कभी भी हास्केल कॉल पर वापस आते हैं या नहीं।

संपादित: मैं वास्तव में प्रयोग नहीं किया है निम्नलिखित सत्यापित करने के लिए, लेकिन अगर हम source of hs_init_ghc को देखो हम देखते हैं कि यह संकेत संचालकों initializes, जो शामिल होना चाहिए timer handlers कि SIGVTALRM पर जवाब देते हैं और वास्तव में यह भी शुरू होता है समय, जो कॉल करता है (POSIX पर) timer_create जो उन संकेतों को नियमित अंतराल पर फेंक देना चाहिए। बदले में, यह समय-समय पर आरटीएस को "जागृत" करना चाहिए या नहीं, कुछ भी हो रहा है, जिसका बदले में यह मतलब होना चाहिए कि यह निष्क्रिय जीसी चलाएगा या नहीं, सिस्टम सी से हास्केल को वापस लाता है या नहीं, लेकिन फिर से, मैंने केवल पढ़ा है कोड और टिप्पणी, इसने खुद का परीक्षण नहीं किया।

+0

आप "पुराने प्रश्नों के उत्तर" किक पर लगते हैं। कोई विशेष कारण, या आप सिर्फ मूड में हैं? – dfeuer

+2

@ डीफ्यूअर अनिद्रा और कभी-कभी बाध्यता जो मुझे हमारे अनुत्तरित प्रश्न अनुपात को चलाने की कोशिश करने के लिए आगे निकलती है। – sclv

+0

@ एससीएलवी मैं इस जवाब को स्वीकार करने के लिए लगभग तैयार हूं, लेकिन मेरे प्रश्न का मांस अभी भी बना हुआ है: जब जीसी वास्तव में चलती है? क्या यह सिर्फ "जब आवंटन होता है" हैस्केल पक्ष या कुछ पर? –

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