2009-11-11 7 views
7

कुछ कार्य OCaml में लागू करने के लिए (उदाहरण के लिए, एक सूची से नक्शा) लेकिन आप OCaml पुस्तकालय के नक्शे का उपयोग कर सकते वास्तव में आसान कर रहे हैं: List.mapOCaml मॉड्यूल और प्रदर्शन

हालांकि, हम आश्चर्य कर सकते हैं जो कोड अधिक कुशल होगा। एक अलग संकलन इकाई (एक पुस्तकालय) के मॉड्यूल को कॉल करने से कुछ संभावित अनुकूलन रद्द हो सकते हैं। मैंने समाचार समूह fa.caml में पढ़ा है कि पुस्तकालयों से कार्यों को कॉल करते समय, बंद का उपयोग किया जाता है।

मैं उत्पादन में OCaml कोड है कि जेनेरिक प्रोग्रामिंग करने के लिए मॉड्यूल और functors का उपयोग कर सकते है। ऐतिहासिक कारण के लिए मेरा कोड मोनोलिटिक है: सभी एक फाइल में। अब मेरे पास और समय है, मैं इस तरह के मॉड्यूल के लिए कोड को कोड में अलग करने के लिए तैयार हूं। हालांकि, मुझे डर है कि मैं प्रदर्शन खो सकता हूं, क्योंकि इसे सही करने में मुझे कुछ समय लगा। उदाहरण के लिए, मेरे पास संख्याओं के साथ जटिल वस्तुओं को लपेटने के लिए मॉड्यूल हैं, इसलिए मैं अद्वितीय प्रतिनिधित्व और तेज़ तुलना को लागू करता हूं। मैं जेनरेट मैप्स, सेट्स और उन पर कैश बनाने के साथ उन लिपटे ऑब्जेक्ट्स का उपयोग करता हूं।

प्रश्न हैं:

  • Am मैं अगर मैं अलग फ़ाइलों को स्थानांतरित प्रदर्शन ढीला करने के लिए जा रहे हैं?
  • क्या ओकैम मॉड्यूल, फ़ैक्टर आदि से भरे मेरे कोड पर कई अनुकूलन कर रहा है?

सी ++ में, यदि आप एक ज में वर्ग विधि को परिभाषित, संकलक अप आदि अंत लघु तरीकों को इनलाइन सकता है, यह है कि अलग फ़ाइलों का उपयोग कर प्राप्त करने के लिए OCaml में संभव है?

+0

मैं ocaml संकलक और संयोजक के आंतरिक भागों के बारे में ज्यादा पता नहीं है, इसलिए मैं अपने सवाल का जवाब नहीं कर सकते हैं। हालांकि, अगर आप अपने कोड को मॉड्यूल में तोड़ने से कोई प्रदर्शन खो देते हैं तो मुझे आश्चर्य होगा। यहां तक ​​कि यदि आपने कुछ मिलीसेकंड खो दिए हैं, तो भी आपके कोड की बढ़ी स्पष्टता इसके लायक होगी। –

+0

सी/सी ++ में जो एक बड़ा अंतर पैदा कर सकता है। मेरे पास लाखों ऑब्जेक्ट्स हैं, जो ज़िलियन बार एक्सेस/तुलना की जाती हैं। प्रति पहुंच के अतिरिक्त संदर्भों का एक सेट बहुत खराब हो सकता है। – hectorpal

+0

हां, लेकिन कंपाइलर को उन संदर्भों को रेखांकित करना चाहिए ताकि आप वास्तव में आवश्यकतानुसार अधिक लुकअप न कर सकें। आप डमी मॉड्यूल के समूह के साथ एक परीक्षण प्रोजेक्ट बनाने का प्रयास कैसे करते हैं और यह मापने की कोशिश करते हैं कि उन्हें तोड़ने और उन्हें उसी फ़ाइल में रखने के बीच कोई अंतर है या नहीं। यह आपके कामकाजी कोडबेस को दोबारा करने से बहुत कम काम हो सकता है। उम्मीद है कि इससे आपको कुछ और आत्मविश्वास मिलेगा कि ओकंपलोप आपके कोड को समझदारी से अनुकूलित करने में सक्षम होगा। –

उत्तर

9

आप कुछ प्रदर्शन खो सकते हैं। लेकिन, इसमें दो कम करने कारक हैं:

  • OCaml मूल कोड संकलक पार मॉड्यूल इनलाइन किए जाने वाले कर सकते हैं, इसलिए यह संभव है कोड (एक जोड़े कैविएट्स के साथ भी अलग संकलन इकाइयों में inlined किए जाने के लिए - पुनरावर्ती कार्य करता है और फ़ंक्शन तर्क मॉड्यूल [1] में रेखांकित नहीं हैं)।
  • कोड अभी भी बहुत संभव है काफी तेजी से हो जाएगा, और पठनीयता और रख-रखाव में लाभ बहुत संभव है किसी भी (सीमांत) प्रदर्शन लागत पल्ला झुकना होगा।

अगर OCaml कोड जहां functors एक ही स्रोत फ़ाइल में परिभाषित कर रहे हैं defunctorizes मैं नहीं जानता। यदि ऐसा नहीं होता है, तो मॉड्यूल को फ़ैक्टर द्वारा पहले से किए गए किसी भी प्रदर्शन हिट को जोड़ना नहीं चाहिए।

सामान्यतः, मेरी राय है कि सरल, पठनीय, रखरखाव योग्य कोड लिखना सबसे अच्छा है और माइक्रोस्कोपिक प्रदर्शन विशेषताओं के बारे में चिंता न करें जब तक कि कोड अभ्यास में बहुत धीमा न हो जाए।

+0

धन्यवाद माइकल। अच्छी जानकारीबेशक मुझे पता है कि मैं पठनीयता प्राप्त करूंगा। अब मेरे पास संतोषजनक नहीं है। हालांकि, मेरे मामले में रनटाइम प्रदर्शन एक महत्वपूर्ण मुद्दा है। मैंने सूची से सरणी में स्विच करने पर बहुत समय पहले निवेश किया है (अब मैं बढ़ते सरणी के लिए रेस लाइब्रेरी का उपयोग कर रहा हूं)। मेरे पास बहुत सारे कैश हैं और ध्यान से डेटास्ट्रक्चर का चयन करते हैं। मुझे लगता है कि मैंने जो किया वह कर कर 10 मिनट या सबसे खराब से 10 सेकंड तक चला गया। मेरी चिंता अब मुख्य रूप से मॉड्यूल के बारे में है जो लाखों वस्तुओं का प्रतिनिधित्व लपेटती है। मैं वैसे भी विभाजित होगा, लेकिन मुझे प्रभाव का आकलन करने की आवश्यकता है और सभी को विभाजित नहीं किया जा सकता है। – hectorpal

+0

एक बार जब आप कोड को रिफैक्टरिंग कर लेंगे, तो इसे आवश्यक रूप से कुछ मॉड्यूल को मुख्य फ़ाइल में ले जाने के लिए अपेक्षाकृत आसान होना चाहिए। –

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

  • कोई संबंधित समस्या नहीं^_^