मुझे Xamarin का दावा है कि Android पर उनके मोनो कार्यान्वयन और उनके C # संकलित ऐप्स जावा कोड से अधिक तेज़ हैं। क्या किसी ने इस तरह के दावों को सत्यापित करने के लिए विभिन्न एंड्रॉइड प्लेटफार्मों पर बहुत समान जावा और सी # कोड पर वास्तविक बेंचमार्क प्रदर्शन किया, कोड और परिणाम पोस्ट कर सकता है?
18 जून 2013 को जोड़ा गया
चूंकि कोई जवाब नहीं था और दूसरों द्वारा किए गए ऐसे बेंचमार्क नहीं पा सके, इसलिए मैंने खुद टेस्ट करने का फैसला किया। दुर्भाग्य से, मेरा प्रश्न "लॉक" है, इसलिए मैं इसे उत्तर के रूप में पोस्ट नहीं कर सकता, केवल प्रश्न को संपादित कर सकता हूं। कृपया इस प्रश्न को पुनः खोलने के लिए मतदान करें। C # के लिए, मैंने Xamarin.Android Ver का उपयोग किया। 4.7.09001 (बीटा)। स्रोत कोड, सभी डेटा जो मैंने परीक्षण और संकलित एपीके पैकेज के लिए उपयोग किया है, वे GitHub पर हैं:
जावा: https://github.com/gregko/TtsSetup_Java
C #: https://github.com/gregko/TtsSetup_C_sharp
यदि कोई अन्य उपकरणों या एमुलेटर पर मेरे परीक्षण को दोहराना चाहेगा, तो मुझे परिणाम जानने के लिए दिलचस्पी होगी।
मेरे परीक्षण से परिणाम
मैंने अपने वाक्य निष्कर्षक वर्ग को C # (मेरे @Voice अलाउड रीडर ऐप से) पोर्ट किया और अंग्रेजी, रूसी, फ्रेंच, पोलिश और चेक भाषाओं में 10 HTML फ़ाइलों पर कुछ परीक्षण चलाए। प्रत्येक रन को सभी 10 फाइलों पर 5 बार किया गया था, और 3 अलग-अलग उपकरणों और एक एमुलेटर के लिए कुल समय नीचे पोस्ट किया गया है। मैंने "रिलीज़" का परीक्षण किया, केवल डिबगिंग सक्षम किए बिना बनाता है।
एचटीसी नेक्सस वन एंड्रॉयड 2.3.7 (एपीआई 10) - सायनोजेनमॉड रोम
जावा: ग्रैंड कुल समय (5 रन): 12361 एमएस, फाइल रीडिंग कुल के साथ: 13304 एमएस
सी #: ग्रांड कुल समय (5 रन): 17504 एमएस, फाइल रीडिंग कुल के साथ: 17956 एमएस
सैमसंग गैलेक्सी S2 SGH-I777 (एंड्रॉइड 4.0.4, एपीआई 15) - CyanogenMod ROM
जावा: ग्रांड कुल समय (5 रन): 8947 एमएस, फाइल पढ़ने के साथ कुल: 9186 एमएस
सी #: ग्रांड कुल समय (5 रन): 9884 एमएस, फाइल रीडिंग कुल के साथ: 10247 एमएस
सैमसंग GT-N7100 (एंड्रॉइड 4.1.1 जेलीबीन, एपीआई 16) - सैमसंग रोम
जावा: ग्रैंड टोटल टाइम (5 रन): 9742 एमएस, फाइल रीडिंग कुल: 10111 एमएस
सी #: ग्रांड कुल समय (5 रन): 10459 एमएस, फाइल रीडिंग कुल के साथ: 10696 एमएस
एमुलेटर - इंटेल (एंड्रॉइड 4.2, एपीआई 17)
जावा: ग्रैंड टोटल टाइम (5 रन): 2699 एमएस, फाइल रीडिंग कुल के साथ: 3127 एमएस
C #: ग्रैंड टोटल टाइम (5 रन): 2049 एमएस, फाइल रीडिंग कुल के साथ: 2182 एमएस
एमुलेटर - इंटेल (एंड्रॉइड 2.3.7, एपीआई 10)
जावा: ग्रैंड टोटल टाइम (5 रन): 2992 एमएस, फाइल रीडिंग कुल के साथ: 3591 एमएस
C #: ग्रैंड टोटल टाइम (5 रन): 2049 एमएस, फाइल रीडिंग कुल के साथ: 2257 एमएस
एमुलेटर - आर्म (एंड्रॉइड 4.0.4, एपीआई 15)
जावा: ग्रैंड टोटल टाइम (5 रन): 41751 एमएस, फाइल रीडिंग कुल के साथ: 43866 एमएस
सी #: ग्रैंड टोटल टाइम (5 रन): 44136 एमएस, फाइल रीडिंग कुल: 45109 एमएस
छोटी चर्चा
मेरे परीक्षण कोड में मुख्य रूप से टेक्स्ट पार्सिंग, रिप्लेसिंग और रेगेक्स खोजें शामिल हैं, शायद अन्य कोड (जैसे अधिक संख्यात्मक संचालन) के लिए परिणाम भिन्न होंगे। ARM प्रोसेसर वाले सभी डिवाइसों पर, Java ने Xamarin C # कोड से बेहतर प्रदर्शन किया। सबसे बड़ा अंतर Android 2.3 के तहत था, जहां C # कोड लगभग होता है। जावा गति का 70%।
इंटेल एमुलेटर पर (इंटेल HAX तकनीक के साथ, एमुलेटर तेज पुण्य मोड में चलता है), Xamarin C # कोड जावा के मुकाबले मेरा नमूना कोड बहुत तेजी से चलाता है - लगभग 1.35 समय तेजी से। शायद मोनो वर्चुअल मशीन कोड और लाइब्रेरी एआरएम की तुलना में इंटेल पर बहुत बेहतर रूप से अनुकूलित हैं?
8 जुलाई 2013 को संपादित करें
मैंने अभी Genymotion Android एमुलेटर स्थापित किया है, जो Oracle VirtualBox में चलता है, और फिर से यह एआरएम प्रोसेसर का अनुकरण न करते हुए देशी इंटेल प्रोसेसर का उपयोग करता है। Intel HAX एमुलेटर के साथ, फिर से C # यहां बहुत तेजी से चलता है। यहाँ मेरे परिणाम हैं:
जीनोम्यूलेटर एमुलेटर - इंटेल (एंड्रॉइड 4.1.1, एपीआई 16)
जावा: ग्रैंड टोटल टाइम (5 रन): 2069 एमएस, फाइल रीडिंग कुल के साथ: 2248 एमएस
सी #: ग्रैंड टोटल टाइम (5 रन): 1543 एमएस, फाइल रीडिंग कुल के साथ: 1642 एमएस
मैंने तब देखा कि Xamarin के लिए एक अद्यतन था। एंड्रॉइड बीटा, संस्करण 4.7.11, जिसमें रिलीज नोट्स के साथ-साथ मोनो रनटाइम में कुछ बदलावों का भी उल्लेख था। कुछ एआरएम उपकरणों, और बड़े आश्चर्य का परीक्षण करने का निर्णय लिया गया - C # संख्या में सुधार हुआ:
बीएन नुक्कड़ एक्सडी +, एआरएम (एंड्रॉयड 4.0)
जावा: ग्रैंड टोटल टाइम (5 रन): 8103 एमएस, फाइल रीडिंग कुल के साथ: 8569 एमएस
C #: ग्रैंड टोटल टाइम (5 रन): 7951 एमएस, फाइल रीडिंग कुल के साथ: 8161 एमएस
वाह! C # अब जावा से बेहतर है? मेरे गैलेक्सी नोट 2 पर परीक्षण दोहराने का फैसला:
सैमसंग गैलेक्सी नोट 2 - ARM (Android 4.1.1)
जावा: ग्रैंड टोटल टाइम (5 रन): 9675 एमएस, फाइल रीडिंग कुल: 10028 एमएस
सी #: ग्रांड कुल समय (5 रन): 9911 एमएस, फाइल रीडिंग कुल के साथ: 10104 एमएस
यहाँ C # केवल थोड़ा धीमा प्रतीत होता है, लेकिन इन नंबरों ने मुझे एक विराम दिया: Nook HD + की तुलना में समय अधिक क्यों है, भले ही नोट 2 में तेज प्रोसेसर है? जवाब: बिजली की बचत मोड। नुक्कड़ पर, यह नोट 2 पर सक्षम था - सक्षम। पावर सेविंग मोड डिसेबल (सक्षम के साथ, यह प्रोसेसर की गति को भी सीमित करता है) के साथ परीक्षण करने का निर्णय लिया गया:
सैमसंग गैलेक्सी नोट 2 - एआरएम (एंड्रॉइड 4.1.1), बिजली की बचत अक्षम
जावा: ग्रैंड कुल समय (5 रन): 7153 एमएस, फाइल रीडिंग कुल के साथ: 7459 एमएस
सी #: ग्रांड कुल समय (5 रन): 6906 एमएस, फाइल रीडिंग कुल के साथ: 7070 एमएस
अब, आश्चर्यजनक रूप से, एआर प्रोसेसर पर जावा की तुलना में सी # थोड़ा तेज है। बड़ा सुधार!
12 जुलाई 2013 को संपादित करें
हम सभी जानते हैं, कि गति के लिए देशी कोड कुछ भी नहीं धड़कता है, और मैं जावा या C # में अपने वाक्य फाड़नेवाला के प्रदर्शन से संतुष्ट नहीं था, विशेष रूप से कि मुझे इसे सुधारने की आवश्यकता है (और इस तरह इसे और भी धीमा कर दें)। इसे C ++ में फिर से लिखने का निर्णय लिया गया। यहां एक छोटी (यानी पिछले परीक्षणों की तुलना में फ़ाइलों का एक छोटा सेट, अन्य कारणों से) मेरे गैलेक्सी नोट 2 पर मूल बनाम जावा की गति की तुलना, बिजली की बचत मोड अक्षम के साथ है:
जावा: ग्रैंड टोटल टाइम (5 रन): 3292 एमएस, फाइल रीडिंग कुल के साथ: 3454 एमएस
मूल अंगूठे: कुल समय (5 रन): 537 एमएस, फाइल पढ़ने के साथ कुल: 657 एमएस
मूल भुजा: ग्रैंड कुल समय (5 रन): 458 एमएस, फाइल पढ़ने के साथ कुल: 587 एमएस
मेरे विशेष परीक्षण के लिए लग रहा है, मूल कोड जावा की तुलना में 6 से 7 गुना तेज है। कैविएट: एंड्रॉइड पर std :: regex क्लास का उपयोग नहीं कर सकता था, इसलिए मुझे पैराग्राफ ब्रेक या एचटीएमएल टैग की खोज करने के लिए अपनी विशेष दिनचर्या लिखनी थी। रेगेक्स का उपयोग करते हुए पीसी पर एक ही कोड के मेरे शुरुआती परीक्षण, जावा की तुलना में लगभग 4 से 5 गुना तेज थे।
ओह! कच्ची मेमोरी को चार * या व्हचर * पॉइंटर्स के साथ फिर से जागना, मुझे तुरंत 20 साल छोटा लगा! :)
15 जुलाई 2013 को संपादित करें
(नीचे देखें, Dot42 के साथ बेहतर परिणाम के लिए 7/30/2013 के संपादन के साथ)
कुछ कठिनाई के साथ, मैंने अपने C # परीक्षणों को Dot42 (संस्करण 1.0.1.71 बीटा), Android के लिए एक और C # प्लेटफ़ॉर्म पोर्ट करने में कामयाब रहा। प्रारंभिक परिणाम बताते हैं कि Dot42 कोड इंटेल एंड्रॉइड एमुलेटर पर Xamarin C # (v। 4.7.11) की तुलना में लगभग 3x (3 गुना) धीमा है। एक समस्या यह है कि Dot42 में System.Text.RegularExpressions वर्ग में स्प्लिट () फ़ंक्शन नहीं है जो मैंने Xamarin परीक्षणों में उपयोग किया था, इसलिए मैंने इसके बजाय Java.Util.Regex वर्ग और Java.Util .egex.Pattern.Split () का उपयोग किया। , इसलिए कोड में इस विशेष स्थान में, यह छोटा अंतर है। हालांकि एक बड़ी समस्या नहीं होनी चाहिए। Dot42 Dalvik (DEX) कोड के लिए संकलित करता है, इसलिए यह मूल रूप से एंड्रॉइड पर जावा के साथ सहयोग करता है, Xamarin की तरह C # से जावा तक महंगे इंटरोप की आवश्यकता नहीं है।
तुलना के लिए, मैं एआरएम उपकरणों पर परीक्षण भी चलाता हूं - यहां डॉट 42 कोड "केवल" है जो ज़मारिन सी # की तुलना में धीमा है। यहाँ मेरे परिणाम हैं:
एचटीसी नेक्सस वन एंड्रॉयड 2.3.7 (एआरएम)
जावा: ग्रैंड टोटल टाइम (5 रन): 12187 एमएस, फाइल रीडिंग कुल: 13200 एमएस
ज़ामरीन सी #: ग्रैंड टोटल टाइम (5 रन): 13935 एमएस, फाइल रीडिंग कुल के साथ: 14465 एमएस
Dot42 C #: ग्रैंड टोटल टाइम (5 रन): 26000 एमएस, फाइल रीडिंग कुल के साथ: 27168 एमएस
सैमसंग गैलेक्सी नोट 2, एंड्रॉयड 4.1.1 (एआरएम)
जावा: ग्रैंड टोटल टाइम (5 रन): 6895 एमएस, फाइल रीडिंग कुल के साथ: 7275 एमएस
ज़ामरीन सी #: ग्रैंड टोटल टाइम (5 रन): 6466 एमएस, फाइल पढ़ने के साथ कुल: 6720 एमएस
Dot42 C #: ग्रैंड टोटल टाइम (5 रन): 11185 एमएस, फाइल रीडिंग कुल के साथ: 11843 एमएस
इंटेल एमुलेटर, एंड्रॉइड 4.2 (x86)
जावा: ग्रैंड कुल समय (5 रन): 2389 एमएस, फाइल पढ़ने के साथ कुल: 2770 एमएस
ज़ामरीन सी #: ग्रैंड टोटल टाइम (5 रन): 1748 एमएस, फाइल रीडिंग कुल के साथ: 1933 एमएस
Dot42 C #: ग्रैंड टोटल टाइम (5 रन): 5150 एमएस, फाइल रीडिंग कुल के साथ: 5459 एमएस
मेरे लिए, यह भी ध्यान रखना दिलचस्प है कि Xamarin C # नए ARM डिवाइस पर Java की तुलना में थोड़ा तेज है और पुराने Nexus One पर थोड़ा धीमा है। यदि कोई भी इन परीक्षणों को चलाना चाहे, तो कृपया मुझे बताएं और मैं GitHub के स्रोतों को अपडेट करूंगा। इंटेल प्रोसेसर के साथ एक वास्तविक एंड्रॉइड डिवाइस से परिणाम देखना विशेष रूप से दिलचस्प होगा।
अपडेट 7/26/2013
बस एक त्वरित अद्यतन, नवीनतम Xamarin.Android 4.8 के साथ बेंचमार्क ऐप्स द्वारा फिर से संकलित किया गया, और आज जारी किए गए डॉट42 1.0.1.72 अपडेट के साथ भी - पहले बताए गए परिणामों से कोई महत्वपूर्ण परिवर्तन नहीं।
अद्यतन 7/30/2013 - dot42 के लिए बेहतर परिणाम
मेरे जावा कोड के C # पर रॉबर्ट के (डॉट 42 निर्माताओं से) पोर्ट के साथ डॉट 42 का पुनः परीक्षण किया। Xamarin के लिए शुरू में किए गए मेरे C # पोर्ट में, मैंने कुछ मूल जावा वर्गों को प्रतिस्थापित किया, जैसे ListArray, List वर्ग के मूल निवासी C # के साथ, आदि। रॉबर्ट के पास मेरा Dot42 स्रोत कोड नहीं था, इसलिए उन्होंने इसे जावा से फिर से पोर्ट किया और अन्य जावा कक्षाओं का उपयोग किया। ऐसी जगहें, जो Dot42 को फायदा पहुंचाती हैं, मुझे लगता है क्योंकि यह Dalvik VM में चलती है, जावा की तरह, और मोनो में, ज़मरीन की तरह नहीं। अब Dot42 के परिणाम काफी बेहतर हैं। यहाँ मेरे परीक्षण से एक लॉग है:
7/30/2013 - Dot42 C # में अधिक जावा कक्षाओं के साथ Dot42 परीक्षण
इंटेल एमुलेटर, एंड्रॉइड 4.2
Dot42, ग्रेग का कोड StringBuilder.Replace () (Xamarin के रूप में) का उपयोग करते हुए:
ग्रैंड कुल समय (5 रन): 3646 ms, फ़ाइल पढ़ने का कुल योग: 3830 msDot42, ग्रेग का कोड String.Replace () का उपयोग करते हुए (जैसा कि जावा और रॉबर्ट के कोड में है):
ग्रैंड कुल समय (5 रन): 3027 एमएस, फाइल रीडिंग कुल के साथ: 3206 एमएसDot42, रॉबर्ट कोड:
ग्रैंड टोटल टाइम (5 रन): 1781 एमएस, फाइल रीडिंग कुल: 1999 एमएसज़मीरिन:
ग्रैंड कुल समय (5 रन): 1373 एमएस, फ़ाइल पढ़ने के साथ कुल: 1505 एमएसजावा:
ग्रैंड टोटल टाइम (5 रन): 1841 एमएस, फाइल रीडिंग कुल: 2044 एमएसएआरएम, सैमसंग गैलेक्सी नोट 2, बिजली की बचत, एंड्रॉइड 4.1.1
Dot42, ग्रेग का कोड StringBuilder.Replace () (Xamarin के रूप में) का उपयोग करते हुए:
ग्रैंड कुल समय (5 रन): 10875 ms, फ़ाइल पढ़ने का कुल योग: 11280 msDot42, ग्रेग का कोड String.Replace () और जावा (रॉबर्ट्स कोड के रूप में) का उपयोग कर:
ग्रैंड कुल समय (5 रन): 9710 एमएस, फाइल पढ़ने के साथ कुल: 10097 एमएसDot42, रॉबर्ट कोड:
ग्रांड कुल समय (5 रन): 6279 एमएस, फ़ाइल पढ़ने के साथ कुल: 6622 एमएसज़मीरिन:
ग्रैंड कुल समय (5 रन): 6201 एमएस, फ़ाइल पढ़ने के साथ कुल: 6476 एमएसजावा:
ग्रैंड टोटल टाइम (5 रन): 7141 एमएस, फाइल रीडिंग कुल के साथ: 7479 एमएस
मुझे अभी भी लगता है कि डॉट 42 को अभी लंबा रास्ता तय करना है। जावा जैसी कक्षाएं (जैसे ArrayList) और उनके साथ एक अच्छा प्रदर्शन होने से जावा से C # थोड़ा आसान पोर्टिंग कोड बन जाएगा। हालाँकि, यह कुछ ऐसा है जिसकी मुझे बहुत संभावना नहीं है। मैं इसके बजाय मौजूदा सी # कोड (पुस्तकालयों आदि) का उपयोग करना चाहता हूं, जो देशी सी # कक्षाएं (जैसे सूची) का उपयोग करेगा, और वह वर्तमान डॉट 42 कोड के साथ धीरे-धीरे और बहुत अच्छी तरह से ज़मरीन के साथ प्रदर्शन करेगा।
ग्रेग