2013-02-26 10 views
12

इस समारोह पर विचार करें:क्या हास्केल ऑप्टिमाइज़र स्कोप में बार-बार फ़ंक्शन कॉल के लिए ज्ञापन का उपयोग करता है?

f as = if length as > 100 then length as else 100 

के बाद से समारोह शुद्ध यह स्पष्ट है कि लंबाई दोनों कॉल में एक ही हो जाएगा। मेरा सवाल है कि हास्केल ऑप्टिमाइज़र उपर्युक्त कोड को निम्नलिखित के बराबर में बदल देता है?

f as = 
    let l = length as 
    in if l > 100 then l else 100 

यदि ऐसा होता है, तो कौन सा स्तर सेटिंग इसे सक्षम बनाता है? अगर ऐसा नहीं होता है, तो क्यों? इस परिदृश्य में this answer में बताया गया है कि मेमोरी कचरा कारण नहीं हो सकता है, क्योंकि फ़ंक्शन निष्पादन समाप्त होने के साथ ही प्रारंभिक चर जारी हो जाता है।


कृपया ध्यान दें कि इस स्थानीय गुंजाइश की वजह से this question का डुप्लिकेट नहीं है, और इस तरह यह एक बिल्कुल भिन्न जवाब मिल सकता है।

उत्तर

15

जीएचसी अब some CSE by default करता है, क्योंकि -fcse ध्वज चालू है।

डिफ़ॉल्ट रूप से .. सामान्य-उप-अभिव्यक्ति उन्मूलन अनुकूलन को सक्षम करता है। यदि आप कुछ असुरक्षित पैराफॉर्मियो अभिव्यक्तियां हैं जिन्हें आप आम नहीं करना चाहते हैं तो इसे बंद करना उपयोगी हो सकता है।

हालांकि, यह साझा करने के साथ समस्याओं (और इस प्रकार अंतरिक्ष लीक) के कारण conservative है। सीएसई पास bit better हालांकि (और this) प्राप्त कर रहा है।

अंत में, ध्यान दें कि पूर्ण सीएसई के लिए एक प्लगइन है।

आप कोड है कि उस से फायदा हो सकता है है।

13

यहां तक ​​कि ऐसी स्थानीय सेटिंग में, यह अभी भी मामला है कि यह स्पष्ट नहीं है कि साझाकरण का परिचय हमेशा एक अनुकूलन है। इस उदाहरण परिभाषा

पर विचार करें
f = if length [1 .. 1000000] > 0 then head [1 .. 1000000] else 0 

बनाम यह एक

f = let xs = [1 .. 1000000] in if length xs > 0 then head xs else 0 

और आप इस मामले में मिल जाएगा कि, पहली ज्यादा बेहतर व्यवहार करती है, के रूप में सूची पर प्रदर्शन संगणना से प्रत्येक सस्ती है, जबकि दूसरा संस्करण सूची को length द्वारा स्मृति में पूरी तरह से प्रकट किया जाएगा, और इसे head के बाद ही हटा दिया जा सकता है।

+3

इस समस्या के बावजूद, सीसीई के साथ ghc अधिक आक्रामक हो सकता है। आपके पास सीएसईईंग के मूल्य का आकार अनुमान होना चाहिए। एक साधारण अनुमान यह है कि आधार प्रकार लापरवाह स्थान लेते हैं। – augustss

+0

@augustss सहमत। – kosmikus

+0

'लंबाई [1 .. 1000000]> 0' एक सस्ता ऑपरेशन कैसा है? ">" का मूल्यांकन करने से पहले "लंबाई" वापस नहीं आना चाहिए?(Ghci में, जब मैं सूची के आकार को बढ़ाता हूं तो ऑपरेशन को धीमा कर दिया जाता है) –

4

यदि आप वर्णन कर रहे हैं तो common subexpression elimination के साथ ज्ञापन की तुलना में अधिक करना है, हालांकि ऐसा लगता है कि GHC currently doesn't do that either क्योंकि अनपेक्षित साझाकरण स्थान लीक का कारण बन सकता है।

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