2011-01-21 16 views
14

मेरे पास क्लोजर और जावा दोनों का उपयोग करके एक एप्लिकेशन के बारे में एक दिलचस्प वास्तुकला प्रश्न है। एप्लिकेशन में बहुत गहन, समवर्ती डेटा प्रोसेसिंग कार्य शामिल हैं जिन्हें ऑर्केस्ट्रेट करने की आवश्यकता है।क्लोजर और जावा के बीच की रेखा कहां खींचना है?

यहाँ दोनों Clojure और जावा मिश्रण के लिए तर्क दिया गया है:

  • जावा कुछ बहुत CPU- सघन संख्यात्मक कोड, जहां मैं JVM पर के रूप में तेजी से संभव के रूप में चलाने के लिए एल्गोरिथ्म को अनुकूलित करने की जरूरत के लिए आवश्यक है । क्लोजर अभी तक इसे हासिल नहीं कर सकता है, और इस तरह का कोड क्लोजर में बहुत मूर्खतापूर्ण नहीं होगा क्योंकि एल्गोरिदम को प्रदर्शन कारणों से बहुत सारे परिवर्तनीय डेटा की आवश्यकता होती है।
  • क्लोजर (IMHO) के लिए बहुत बेहतर है, आवेदन के कुल प्रवाह को कार्यान्वित करना, कार्यात्मक प्रोग्रामिंग के लिए उत्कृष्ट समर्थन, आरईपीएल और समवर्ती सुविधाओं पर इंटरैक्टिव गतिशील विकास के साथ।

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

+0

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

+0

@ मॉरीट्ज - हाँ मैंने अंतर मापा! टाइपिंग संकेत मुझे काफी करीब नहीं मिला (प्राइमेटिव्स का मुक्केबाजी बड़ा हत्यारा है, लेकिन कुछ अन्य ओवरहेड भी थे जिन्हें मैं समझ नहीं पाया - शायद मैं क्लोजर 1.4 :-) में फिर से देखूंगा)। मुझे उत्परिवर्तन की आवश्यकता है क्योंकि मुझे बहुत से अस्थायी कामकाजी डेटा में हेरफेर करना है। एक [i] = एक [जे] + एक्स जावा में बहुत तेज़ है, निश्चित रूप से कम से कम किसी भी अपरिवर्तनीय डेटा संरचना को अपडेट करने से तीव्रता का क्रम (जो ऑब्जेक्ट आवंटन और जीसी ओवरहेड का तात्पर्य है)। – mikera

+0

यह वास्तव में आपके प्रश्न का उत्तर नहीं देता है लेकिन आप C++/C और JNI में संख्यात्मक पक्ष को क्लोजर – justinhj

उत्तर

10

जावा और क्लोजर के सापेक्ष फायदों की आपकी धारणा पर टिप्पणी किए बिना, और यह मानते हुए कि आपने कम से कम कुछ माइक्रो-बेंचमार्किंग को मान्य करने के लिए मान्य किया है कि धारणा के पास सही होने का कुछ मौका है, तो सही दृष्टिकोण प्रतीत होता है जावा को केवल उन हिस्सों के लिए छोड़ दें जिन्हें अनुकूलन की आवश्यकता है।

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

+0

धन्यवाद यशशा - अच्छे विचार! कुछ अन्य प्रयोगों के साथ, मैं इस पर सबसे अच्छा समाधान के रूप में अभिसरण कर रहा हूं – mikera

2

क्लोजर डेवलपर्स को सरल कार्यात्मक शैली में अपना अधिकांश हिस्सा प्राप्त करने और सीमित क्षेत्रों में उत्परिवर्ती कार्य को अलग करने में मदद करने का एक अच्छा काम करता है।

मैं यहां वही दिशानिर्देश लागू करता हूं: जितना आप कर सकते हैं जावा कोड को अलग करें, क्योंकि आप अपने शुद्ध क्लोजर कोड को "शुद्ध कार्यात्मक शैली" में करेंगे। तो जावा द्वीप जितना संभव हो सके उतना छोटा होगा जितना संभव हो सकता है, और जावा द्वीप तक पहुंच क्लोजर कार्यों के एक छोटे से सेट के माध्यम से जायेगी।

सुनिश्चित नहीं है कि यह बहुत मदद करता है, लेकिन वैसे भी!

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