2011-09-25 30 views
7

मैं विजुअल स्टूडियो 2010 एसपी 1 का उपयोग कर रहा हूं, लक्ष्य ढांचा 2.0 है, प्लेटफार्म लक्ष्य: कोई भी सीपीयू, विंडोज 7 x64 एसपी 1 के तहत परीक्षण।अजीब प्रदर्शन व्यवहार

मुझे अजीब प्रदर्शन व्यवहार का अनुभव हो रहा है।

एक app.config के बिना, या निम्न app.config साथ, यह मेरी कार्यक्रम चलाने धीरे धीरे (स्टॉपवॉच शो ~ 0.11 रों)

<?xml version="1.0"?> 
<configuration> 
    <startup > 
    <supportedRuntime version="v2.0.50727" /> 
    </startup> 
</configuration> 

निम्नलिखित app.config मेरा कार्यक्रम रन x5 गुना तेजी से बनाता है बनाता है (स्टॉपवॉच चलता ~ 0.02 रों)

<?xml version="1.0"?> 
<configuration> 
    <startup > 
    <supportedRuntime version="v4.0.30319" sku=".NETFramework,Version=v4.0" /> 
    </startup> 
</configuration> 

इस परीक्षा कार्यक्रम कोड है:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Diagnostics; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Stopwatch sw = new Stopwatch(); 

     while (true) 
     { 
      sw.Reset(); 
      sw.Start(); 

      for (int i = 0; i < 1000000; i++) 
      { 
       "blablabla".IndexOf("ngrhotbegmhroes", StringComparison.OrdinalIgnoreCase); 
      } 

      Console.WriteLine(sw.Elapsed); 
     } 
    } 
} 

मैं घंटों तक बैठे और यह पता नहीं लगा सकता कि यहां क्या हो रहा है। क्या आपको कोई विचार है?

+0

System.String वर्ग के साथ ही वी.एस. 11 से चल रहा है नेट 4 में बदल गया था CLR में NLS बिट्स पर काम के बहुत सारे के साथ। आप उचित उम्मीदों की अपेक्षा नहीं कर सकते हैं, केवल उम्मीद है। –

उत्तर

15

ऐसा लगता है कि तुम सिर्फ एक स्थिति है जिसमें .NET 4 एक बहुत तेजी से होता है मिल गया है। डिफ़ॉल्ट रूप से, आपका ऐप उस ढांचे के साथ चल रहा है जिसे इसे लक्षित करने के लिए बनाया गया था। जब आप बल इसे .NET 4 का उपयोग करने के लिए, यह तेज़ है। यह एक जेआईटी कंपाइलर सुधार हो सकता है जो आपकी स्थिति को प्रभावित करता है, या यह एक ढांचागत सुधार हो सकता है - लेकिन यह आश्चर्यजनक नहीं होना चाहिए कि कुछ संस्करण नए संस्करणों में तेज़ हैं।

(इसके लिए क्या लायक है, मैं उस समय की पुनरावृत्ति की संख्या में वृद्धि करूंगा जो आप समय पर हैं ... मेरे बॉक्स पर .NET 4 के तहत, प्रत्येक पुनरावृत्ति केवल 10ms है, जो वास्तव में नहीं है । महान माप मैं कम से कम कुछ सेकंड के लिए बेंचमार्क करना पसंद करते हैं)

(और मिच की तरह, मैं पुष्टि कर सकता है कि मैं एक ही प्रभाव देखें)

संपादित करें:।। मैं तो बस इस एक सा आगे की जांच की है , और एक दिलचस्प प्रभाव देखा ... मुझे लगता है कि हम haystack.IndexOf(needle, StringComparison.OrdinalIgnoreCase):

  • .NET पर कॉल कर रहे हैं 2, परिणाम हैं लगभग एक ही है लेकिन बड़ी "सुई"
  • .NET 4 पर है:
    • तो needlehaystack तुलना में बड़ा है .NET 4 (अपने उदाहरण के अनुसार) नेट 2
    • की तुलना में बहुत तेजी से होता है
    • तो needlehaystack रूप में एक ही आकार है, .NET 4 एक थोड़ा बिट नेट की तुलना में धीमी 2
    • तो needlehaystack से छोटा होता है है, .NET 4 एक बहुत नेट की तुलना में धीमी 2

(यह एक परीक्षण जहां needle का पहला वर्ण कभी नहीं haystack में प्रकट होता है बना रहा है, btw।)

+0

"जब आप इसे .NET का उपयोग करने के लिए मजबूर करते हैं" नहीं पढ़ना चाहिए "जब आप इसे .NET ** 4 ** का उपयोग करने के लिए मजबूर करते हैं"? – Ani

+0

@ एनी: ओह, हाँ, धन्यवाद। –

+4

"अगर सुई हैस्टैक से छोटी है, .NET 4 बहुत धीमी है" - तब बहुत खराब अनुकूलन की तरह लगता है। –

4

मैं बस कुछ बदलाव (जो और अधिक पुनरावृत्तियों और औसतन शामिल है) के साथ अपने बेंचमार्क भाग गया, और पुष्टि कर सकते हैं कि .NET 4.0 लक्षित संस्करण वास्तव में 4-5 गुना तेज है।

तो अनुमानतः IndexOf() को .NET 4 में अनुकूलित किया गया था।0

3

ठीक है, कुछ नए VS11

n = 1000000; 
string haystack = "ngrhotbegmhroes"; 
string needle = "blablablablablablablablablangrhotbegmhrobla bla"; 

.NET 4.5 : 8 ms 
.NET 4.0 : 8 ms 
.NET 3.5 : 45 ms 
.NET 2.0 : 45 ms 

साथ बेंचमार्क तो ये पहला परिणाम अपने निष्कर्षों की पुष्टि, नए संस्करणों के तेजी से कर रहे हैं।

हालांकि यह एक बड़ा स्ट्रिंग के अंदर कम स्ट्रिंग देखने के लिए और अधिक आम है: चीजें मिल गया जिसका मतलब है

n = 1000000; 
haystack = "blablablablablablablablablangrhotbegmhrobla bla"; 
needle = "ngrhotbegmhroes"; 

.NET 4.5 : 1020 ms 
.NET 4.0 : 1020 ms 
.NET 3.5 : 155 ms 
.NET 2.0 : 155 ms 

और एक बहुत लंबे समय तक भूसे के ढेर के साथ (~ 400 वर्ण)

.NET 4.0 : 12100 ms 
.NET 2.0 : 1700 ms 

सबसे आम उपयोग पैटर्न के लिए बदतर ...


रिलीज कॉन्फ़िगरेशन और क्ल में सभी माप ient प्रोफाइल जहां उपलब्ध है।
Ctrl + F5
जीत 7H, कोर i7 2620M

+0

वाह - यह वास्तव में अजीब है - आश्चर्य है कि सीएलआर/बीसीएल के कुछ आंतरिक इस बारे में कुछ कह सकते हैं ... – Carsten

+0

एक छोटी सी घाटी में लंबी सुई की तलाश करने का क्या मतलब है? डिजाइन द्वारा यह गलत नहीं है? – yas4891

+0

@ yas4891: हाँ, लेकिन यह मूल प्रश्न था और इसका बहुत अलग प्रदर्शन है। –

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