2012-08-16 23 views
7

मैंने देखा कि सी # जिटर सी ++ कंपाइलर की तुलना में मापने योग्य धीमी कोड उत्पन्न करता है, भले ही कोई "प्रबंधित ओवरहेड" संरचनाएं न हों (जैसे चेक किए गए अनुक्रमण वाले सरणी)।सी # जिटर सुधार

public static int count = 1000000000; 
public static int Main() 
{ 
    int j = 0; 
    for (int i = 0; i < count; ++i) 
    { 
     j += (i % 2 == 0) ? ((i + 7) >> 3) : (i * 7); 
    } 
    return j; 
} 

इस पाश 3.88s लेता है निष्पादित करने के लिए (/ ओ के साथ संकलित):

यह मात्रा ठहराना करने के लिए, मैं निम्नलिखित सरल पाश समय समाप्त हुआ। वीसी 2010 (-ओ 2) के साथ संकलित समतुल्य लूप 2.95s लेता है।

यह सत्यापित करने के लिए कि निम्न कोड वास्तव में जेनरेट किया गया था, मैंने मशीन कोड की तुलना की: वीसी कंपाइलर से एक लिस्टिंग (/ एफएएस) बनाया, और सी # प्रोग्राम (लूप पूरा होने के बाद) में डीबगर लगाया।

वास्तव में, सी ++ संस्करण कुछ चालाक चाल का उपयोग कर रहा है। उदाहरण के लिए 7 तक महंगा गुणा से बचने के लिए, एक अलग रजिस्टर है जो प्रत्येक लूप गणना 7 द्वारा बढ़ाया जाता है। सी # संस्करण हर बार गुणा (imul) करता है। अन्य मतभेद भी हैं।

मैं समझता हूं कि सी # जिटर के पास बिल्ड समय पर वीसी की तुलना में रनटाइम पर कोड संकलित करने के लिए बहुत कम समय है। लेकिन उदा। जावा जिटर गतिशील रूप से अक्सर उपयोग किए जाने वाले तरीकों को अनुकूलित कर रहा है। सी # ऐसा नहीं प्रतीत होता है।

मेरा प्रश्न है: क्या भविष्य के ढांचे संस्करणों में सी # जिटर को बेहतर बनाने की योजना है?

+0

.NET 4 के साथ विजुअल स्टूडियो आरसी 2012।5 कल से डाउनलोड के लिए उपलब्ध है। इसे डाउनलोड करें (यह मुफ़्त है) और वहां एक ही परीक्षण चलाएं। –

+0

मैंने बहुत समय पहले जिटर द्वारा किए गए नए अनुकूलन के लिए अपनी सांस पकड़ना बंद कर दिया है। एमएस लगता है कि यह उस विभाग में काफी अच्छा है। – harold

+0

@harold कब से? –

उत्तर

3

भविष्य के ढांचे संस्करणों में सी # जिटर को बेहतर बनाने की योजना है?

आप पूछ रहे हैं कि वास्तव में माइक्रोसॉफ्ट और Xamarin के बीच एक गुप्त बैठक पिछले महीने जहां यह सहमति हुई थी कि जब वे दोनों पिछले एक दशक बिताया था उनके संबंधित घबराहट में सुधार, कि अब से वे के बीमार थे चीजों को बेहतर बनाना, और अब और परेशान नहीं होगा, और एमएस सभी को दोबारा सौंपेगा, जबकि ज़ैमरिन किसी भी सबमिट किए गए पैच को अस्वीकार कर देगा जो जिटर में सुधार हुआ है?

मैं कहूंगा कि यह असंभव है, और दुनिया में हर दूसरे सक्रिय रूप से विकसित सॉफ्टवेयर प्रोजेक्ट की तरह, इसमें सुधार करने की योजना है।

इसके अलावा, अगर मैं वास्तव में जितनी जल्दी हो सके कोड को चलाने के लिए चाहता हूं, तो मैं इसे return 161315136; पर अनुकूलित कर दूंगा। इस तरह का कोड साबित कर सकता है कि कार्यान्वयन ए किसी दिए गए मामले में कार्यान्वयन बी से धीमा है, लेकिन इस बारे में कुछ भी नहीं कहता है कि या तो कार्यान्वयन के पीछे लोगों को उनके प्रयासों पर ध्यान देना चाहिए।

+0

यह कोड साबित करना था कि सी # जिटर को सी #+ की तुलना में धीमी गति से सी #+ के लिए दोष देना है, न केवल "प्रबंधित ओवरहेड", जिसमें बहुत से लोग (हर्ब सटर समेत) का उल्लेख है। जाहिर है सरल पूर्णांक संचालन और शाखाओं की तुलना में प्रदर्शन के लिए बहुत कुछ है। – kaalus

+0

हाँ, लेकिन परिणामों से अलग @ हंसपैसेंट इसके साथ मिला, यह सवाल है कि यह कितना प्रासंगिक है। क्या यह जरूरी रूप से जिटर टीमों के लिए अपना प्रयास करने का मामला है? और अगर उन्होंने किया, तो क्या उनमें से किसी के बारे में लिखना दिलचस्प होगा? मुझे लगता है कि यह एक लूप में गुणा करने के बारे में ब्लॉग-पोस्ट की झुकाव के बजाय, इस तरह के मामलों पर आलेखों में आपको कुछ अन्य सुधारों के तहत "और हमने कुछ अन्य सुधार किए" लाइनों के तहत जाना होगा। –

+0

मुझे लगता है कि सी # जिटर में सुधार करके महत्वपूर्ण लाभ हैं। मैं कंप्यूटर भाषा बेंचमार्क गेम (http://shootout.alioth.debian.org) में सी # मैच देखना या जावा को पार करना चाहता हूं। सी # में मूल मूल्य प्रकार हैं और यह वास्तव में एक शर्म की बात है कि जावा अधिकांश समय में बहुत तेज है। हालांकि वे मोनो के साथ परीक्षण करते हैं, एमएस कार्यान्वयन नहीं करते हैं। – kaalus

9

रिलीज बनाता है, VS2008SP1, .NET 3.5SP1, 10 परीक्षण की औसत:

.NET, x86: 2.646 seconds 
C++, x86: 2.652 seconds 
.NET, x64: 2.352 seconds 
C++, x64: 2.090 seconds 

क्लासिक गलतियों मानते हैं कि/ओ महत्वपूर्ण है, jitting समय को मापने, डीबग बिल्ड चल रहा है, डिबगर संलग्न के साथ परीक्षण तो जिटर अनुकूलक अक्षम है।

64 घबराना ही चाल आप का उल्लेख का उपयोग करता है, यह सी ++ कोड जनरेटर लिए अद्वितीय नहीं है:

00000030 xor   r9d,r9d 
... 
00000059 add   r9d,7 

एक नई सुविधा .NET 4.5 के लिए प्रोफ़ाइल गाइडेड अनुकूलन है।

भविष्य की योजनाएं माइक्रोसॉफ्ट जैसी कंपनी द्वारा कभी साझा नहीं की जाती हैं और उन पर अनुमान लगाने में कोई बात नहीं है।

+0

यह स्वीकार्य उत्तर होना चाहिए। – hoodaticus