2009-07-17 9 views
18

मैं उसी मशीन में ऐपडोमेन्स में संचार करने के प्रदर्शन दंड को कम करने की कोशिश कर रहा हूं। मेरे खिलौने के उदाहरण में, कक्षा ए को AppDomain 1 में लोड किया गया है। यह एक AppDomain 2 बनाता है और वहां क्लास 2 (मार्शलबीरफ से क्लास 2 विरासत) का एक उदाहरण वापस प्रॉक्सी प्राप्त करता है। फिर कक्षा 1 बार-बार प्रॉक्सी पर एक विधि कॉल करता है जो कोई मान नहीं देता है।न्यूनतम क्रॉस ऐपडोमेन संचार प्रदर्शन जुर्माना क्या है?

मैं निम्नलिखित परिणाम प्राप्त:

  1. नहीं AppDomains, दोनों वर्गों में एक ही AppDomain में लोड किए गए हैं और पहली कॉल (विधि कोई पैरामीटर है) दूसरे पर विधि repetedly: 24 मिलियन विधि 340.000 तरीकों कॉल/सेकंड
  2. दो AppDomains जैसा कि ऊपर वर्णित एक serializable पैरामीटर (दो स्ट्रिंग की सरणी: कॉल/सेकंड
  3. दो AppDomain जैसा कि ऊपर वर्णित विधि कोई पैरामीटर या "खून बह रहा है" स्ट्रिंग पैरामीटर है ओं): 64.000 विधि कॉल/सेकंड

हालांकि मैं 2 और 3 (क्रमबद्धता) के बीच प्रदर्शन की सजा को समझते हैं, मैं वास्तव में समझ में नहीं आता कि मैं क्यों मामला 2 के मामले 1 से 100 गुना धीमी कर रहा हूँ । मेरी समझ के लिए, प्रॉक्सी बनने के बाद सभी बाद के विधि आमंत्रण वास्तव में तेज़ होना चाहिए क्योंकि एक ऐपडोमेन से दूसरे तक कोई डेटा मार्शल नहीं किया जा रहा है। क्या कोई अब ऐपडोमेन्स में संचार क्यों कर रहा है? क्या मुझसे कुछ गलत हो रही है?

PS1। मेरे पास एकमात्र टिप है जो here है: "और ऐपडोमेन सीमा पार करने की लागत शर्मनाक है।" मैं अनुमान लगा रहा था कि वह धारावाहिकता को संदर्भित करता है ...

PS2। मैं ऐपडोमेन या प्रॉक्सी निर्माण समय (मेरे बेंचमार्क पहली विधि आमंत्रण में शुरू नहीं होता)

PS3 की गणना नहीं करता है। मैं WinXP SP3 मशीन में .NET 3.5 का उपयोग कर रहा हूं। मैंने कोई महत्वपूर्ण मतभेद के साथ .NET 4.0 बीटा 1 भी कोशिश की।

उत्तर

11

यदि आप प्रत्येक परिदृश्य में शामिल आईएल की लाइनों की गिनती करते हैं, तो आप देखेंगे कि सीएलआर रिमोटिंग के दौरान 100 गुना से अधिक काम कर रहा है। प्रत्यक्ष आमंत्रण केवल कुछ ऑपकोड है, लेकिन रिमोटिंग के साथ कई कक्षाएं शामिल हैं, वास्तविक/पारदर्शी प्रॉक्सी, सुरक्षा जांच, क्रमबद्धता, यड्डा यड्डा याड्डा। आपको डिजाइन के माध्यम से इसे संबोधित करने की आवश्यकता होगी - कार्यान्वयन के माध्यम से perf में सुधार के लिए कोई जादू बुलेट नहीं है।

+1

+1 मैं पूरी तरह से आपसे सहमत हूं। एक साधारण सीधी विधि कॉल बेहद सरल है। ** रीमोटिंग ** के माध्यम से एक विधि कॉल बहुत भारी है। ओवरहेड बहुत बड़ा है। एकमात्र असली समाधान एक अच्छा एप्लीकेशन डिज़ाइन है जो क्रॉस ऐपडोमेन संचार की गति पर निर्भर नहीं करेगा। – jpbochi

1

क्या कोई तरीका है कि आप एक ही सहायक विधि को कॉल कर सकते हैं जो पैरामीटर लेता है कि आप जिस विधि को चाहते हैं उसे कॉल करना चाहते हैं? क्रॉस-ऐपडोमेन कॉल प्रदर्शन कार्यान्वयन द्वारा काफी भिन्न होता है। मेरा मानना ​​है कि यह सीएलआर 4.0 में काफी बेहतर हो सकता है, लेकिन मैं वहां विवरणों से पूरी तरह से अवगत नहीं हूं।

आम तौर पर, आप एक सहायक विधि के माध्यम से कॉल को "बैचिंग" द्वारा ओवरहेड से बचना चाहते हैं।

+0

मुझे नहीं लगता कि यह मेरी मदद कैसे करेगा। मेरी कक्षा ए की विधि बिल्कुल वही करती है: लगातार ऑब्जेक्ट को कॉल करना। MyMethod()।यदि प्रॉक्सी में कॉल की लागत वास्तव में एक ही ऐपडोमेन ऑब्जेक्ट पर कॉल से 100 गुना अधिक है, तो मेरे डिजाइन में प्रभाव बहुत बड़ा होगा। – Yiannis

+3

कॉल ऑब्जेक्ट। MyHelperMethod, जो ऑब्जेक्ट को कॉल करता है। MyMethod अन्य ऐपडोमेन में बार-बार। यदि आपको प्रदर्शन की आवश्यकता है और आपने माना है कि इसके लिए उच्च स्पीड क्रॉस-ऐपडोमेन कॉल की आवश्यकता है, तो हां, यह आपके डिज़ाइन पर बड़ा प्रभाव डाल सकता है। –

+0

ओह, मैं देखता हूं ..! :-) ठीक है, यह निश्चित रूप से चीजों को तेजी से बना देगा। लेकिन यह उदाहरण सिर्फ एक खिलौना है, मेरा असली कार्यक्रम प्रति सेकंड 20 मिलियन बार एक ही समारोह को कॉल नहीं करेगा ..! मुझे विभिन्न क्रॉस-एपडोमेन कॉल करना होगा जो सामान्य रूप से तेज़ होना चाहिए। वैसे भी Thnanks! – Yiannis

0

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

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