2009-03-31 12 views
39

क्या छोटे हैकेल निष्पादन योग्य बनाने के कोई अच्छे तरीके हैं? Ghc6 के साथ एक साधारण हैलो वर्ल्ड प्रोग्राम लगभग 370kb (स्ट्रिप से पहले 523 केबी) में आता है। सी में हैलो वर्ल्ड लगभग 4 केबी (स्ट्रिप से 9 किलो पहले) है।छोटे हैकेल निष्पादन योग्य बनाना?

+0

यहां वर्णित गतिशील लिंकिंग का उपयोग करें, http: // stackoverflow।कॉम/प्रश्न/611545 9/छोटे-हैकेल-प्रोग्राम-संकलित-साथ-ghc-in-huge-binary –

उत्तर

44
GHC के विकास शाखा के साथ

(किसी वास्तव में पता है जो संस्करण इस में जोड़ा गया?):

$ ghc -o hello hello.hs 
$ strip -p --strip-unneeded --remove-section=.comment -o hello-small hello 
$ du hello hello-small 
700 hello 
476 hello-small 

एक गतिशील रूप से जुड़े हुए आरटीएस के लिए -dynamic झंडा जोड़े : http://hackage.haskell.org/trac/ghc/wiki/SharedLibraries/PlatformSupport

सी के साथ तुलना के लिए:

$ gcc hello.c -o hello 
$ strip -p --strip-unneeded --remove-section=.comment -o hello-small hello 
$ du hello hello-small 
12 hello 
8 hello-small 
+0

ghc 6.12.1 में मेरे लिए काम करता है। – Joe

+0

यदि आपको मिलता है "शायद आपने पैकेज 'बेस' त्रुटि के लिए प्रोफाइलिंग लाइब्रेरी इंस्टॉल नहीं की हैं, तो apc-get ghc-dynamic इंस्टॉल करें। – matcheek

+0

ओएस एक्स पर समतुल्य 'स्ट्रिप' कमांड क्या होगा? –

8

आप अपने आशीर्वाद (370Kb Luuuxury?) गिनती करना चाहिए: एक और अधिक वहाँ चल रहा

 
bash$ sbcl 
This is SBCL 1.0.24, an implementation of ANSI Common Lisp. 

* (sb-ext:save-lisp-and-die "my.core") 
[undoing binding stack and other enclosing state... done] 
[saving current Lisp image into ./my.core: 
... 
done] 
bash$ du -sh my.core 
25M my.core 
bash$ 

गंभीरता से हालांकि, जबकि आप शायद Haskell बाहर हिला कर सकते हैं एक बिट binaries, यह वास्तव में नहीं सी के साथ एक निष्पक्ष तुलना है नहीं है ।

पिछली बार जब मैंने ghc के साथ खेला (और यह पुराना हो सकता है) यह स्थिर रूप से सबकुछ जोड़ रहा था, जो एक कारक होगा।

21

जीएचसी स्थिर रूप से सबकुछ जोड़ रहा है (रनटाइम द्वारा उपयोग की जाने वाली लाइब्रेरी को छोड़कर, जो गतिशील रूप से जुड़े हुए हैं)।

बुढ़ापे में, जीएचसी ने पूरी तरह से (हैकेल) लाइब्रेरी को लिंक किया है जैसे ही आपने इसका कुछ उपयोग किया है। कुछ समय पहले, जीएचसी ने "प्रति ओबीजे फ़ाइल" लिंक करना शुरू किया, जिसने बाइनरी आकार को काफी हद तक कम कर दिया। आकार से निर्णय लेना, आप पहले से ही नए जीएचसी का उपयोग कर रहे हैं।

प्लस तरफ, आप पहले से ही सामान का एक बहुत उन 500K में, बहु-कोर, कचरा कलेक्टर आदि की तरह है

अपने सी कोड के लिए कम से कम कचरा कलेक्टर जोड़ कर उन्हें फिर से तुलना :)

+1

हालांकि यह सच है कि हास्केल बाइनरी में सी बाइनरी नहीं है, यह बहुत कुछ है, अगर यह है उपयोग नहीं किया जाता है ... –

+5

@ liw.fi यदि आप अपने एक्जिक्यूटिव के आकार के बारे में/उस/चिंतित हैं, सी केवल एकमात्र भाषा है जो आपके लिए पर्याप्त है। – Rayne

+2

@ liw.fi हास्केल कचरा संग्रह, बहु-कोर निष्पादन इत्यादि के बारे में परिभाषा के लगभग है। इसलिए, वास्तव में, यह कोर में सभी चीजें रखने के लिए व्यर्थ _not_ है। या इसे छोड़ दें (मॉड्यूलरलाइज्ड कोर में अतिरिक्त प्रयास डालना जो ऐसा कर सकता है)। और किस लिए? 100K बाइनरी आकार को बचाने के लिए? – ADEpt

6
strip -p --strip-unneeded --remove-section=.comment -o your_executable_small your_executable 

भी डॉ your_executable

16

आकार आप देख रहे हैं हास्केल क्रम (libHSrts.a) है, जो स्थिर हर हास्केल निष्पादन में जुड़ा हुआ है ldd में देखने का प्रयास। यदि यह एक साझा ऑब्जेक्ट था, जैसे c के लिए librt.o, तो आपकी बाइनरी केवल कुछ के (लाइब्रेरी स्रोत में विभाजित .o फ़ाइल का आकार) होगी।

अपने प्लेटफ़ॉर्म पर libHSrts.a की गतिशील लिंकिंग को लागू करने के लिए, आप अपने निष्पादन योग्य स्ट्रिप के माध्यम से छोटे बना सकते हैं।

6

चीजें बदल रही हैं - this काम पर चल रहे टुकड़े पर नजर रखें।

9

अपने द्विआधारी के आकार वास्तव में मायने रखती हैं, तो आप उपकरण gzexe है कि एक (अधिमानतः पहले से ही छीन) gzip संपीड़न के साथ निष्पादन योग्य पैक का उपयोग कर सकते हैं। मेरे 64-बिट लिनक्स बॉक्स पर, मूल हैलो वर्ल्ड प्रोग्राम 3 9 3 केबी को अलग करने के बाद 552 KB लेता है, और 125 KB को अलग करने और gzipping के बाद। Gzipping का गहरा पक्ष प्रदर्शन में है - निष्पादन योग्य पहले अनपॅक किया जाना है। भी

$ ghc -dynamic -o hello hello.hs 
$ strip -p --strip-unneeded --remove-section=.comment -o hello-small hello 
$ du hello hello-small 
24 hello 
16 hello-small 

देखें:

+2

इस बारे में नहीं पता था! यह वास्तव में उपयोगी युक्ति है, मेरे पास 15 एमबी निष्पादन योग्य था जो ** स्ट्रिप ** के बाद 7.3 एमबी तक था, लेकिन फिर ** gzexe ** के बाद 1.5 एमबी तक! मुझे एक और टूल मिला ** [अपक्स] (http://upx.sourceforge.net/) ** जो ** gzexe ** के स्थान पर उपयोग किया जाता है ** निष्पादन योग्य 1.2 एमबी तक पहुंच गया। –

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