2016-05-09 6 views
6

मैं अपने आवेदन को तेज करने की सोच रहा हूं क्योंकि यह प्रदर्शन महत्वपूर्ण है ... यानी हर मिलीसेकंद मैं इससे बाहर निकल सकता हूं बेहतर है। ऐसा करने के लिए मेरे पास एक तरीका है जो कुछ अन्य तरीकों को कॉल करता है और इनमें से प्रत्येक विधि Stopwatch टाइमर और Console.WriteLine कॉल के साथ लपेटा गया है। यानी .:कंसोल। राइटलाइन मेरे कोड को गति देता है?

private void SomeMainMethod() 
{ 
    System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); 
    sw.Start(); 
    SomeMethod(); 
    sw.Stop(); 
    Console.WriteLine("Time for SomeMethod = {0}ms", sw.ElapsedMilliseconds); 

    sw.Reset(); 
    sw.Start(); 
    SomeOtherMethod(); 
    sw.Stop(); 
    Console.WriteLine("Time for SomeOtherMethod= {0}ms", sw.ElapsedMilliseconds); 

    //... 
} 

समस्या यह है जब भी मैं Stopwatch और Console.WriteLine लाइनों कोड चलाता बाहर टिप्पणी के बारे में 20ms (नहीं 50) धीमी जो मैं क्या जरूरत के लिए एक बहुत है।

क्या किसी को पता है कि यह क्यों है?

संपादित करें: SomeMainMethod विधि और कक्षा में दूसरों को भी एक Stopwatch और Console.WriteLine ऊपर के समान कॉल में लिपटे रहे हैं।

SomeMainMethod और जिस तरीके से यह कॉल करता है वह कक्षा का हिस्सा है जो क्लास लाइब्रेरी का हिस्सा है जिसे कंसोल टेस्टबेड से बुलाया जाता है, जिसमें से सभी एकल थ्रेडेड होते हैं।

अधिक जानकारी के लिए: ऐप x86 .NET 4.6.1 में चल रहा है ऑप्टिमाइज़ेशन सक्षम के साथ रिलीज मोड। मैं इसे विजुअल स्टूडियो 2013 में भी नहीं चला रहा हूं।

+1

यह ध्वनि अजीब अजीब लगता है .. मैं नहीं कह सकता कि मैंने – BugFinder

+1

की गति में बदलावों को देखा है यदि आप स्टॉपवॉच का उपयोग नहीं कर रहे हैं, तो आप उसी समय में समय को माप नहीं रहे हैं। क्या आपने इसके लिए जिम्मेदार है? – stuartd

+1

@ स्टुअर्टड लेकिन hes ने कहा कि स्टॉपवॉच को हटाकर और * धीमे * प्रदर्शित करता है, तेज़ नहीं? तो कम कोड – BugFinder

उत्तर

2

कोई जवाब नहीं question पढ़ने के बाद मुझे कोई समस्या नहीं मिल सकती है।

यह वास्तव में एक बड़ी अनुमान है: टिप्पणी अनुभाग में एक उपयोगकर्ता (ForguesR) निम्नलिखित टिप्पणी की शायद क्योंकि आप और आपके धागा अधिक प्रोसेसर समय हो जाता है Io क्योंकि WriteLine सिंक्रनाइज़ है लिख रहे हैं इस प्रकार अन्य धागे अवरुद्ध।

नोट:

तो मैं अगर यह वास्तव में मामला था तो मैं SomeMainMethod बदल निम्नलिखित पसंद करने के लिए जाँच करने के लिए चाहते थे यह आम तौर पर धागा प्राथमिकताओं के साथ चारों ओर खेलने के लिए सलाह दी जाती नहीं है, यह केवल एक था सिद्धांत का परीक्षण करने के लिए कामकाज। मैं दृढ़ता से उत्पादन कोड में ऐसा करने की सलाह दूंगा जबतक कि आप 100% सुनिश्चित न हों कि आप जानते हैं कि आप क्या कर रहे हैं। तो शायद अभी भी इससे दूर रहें।

private void SomeMainMethod() 
{ 
    System.Threading.ThreadPriority tp = System.Threading.ThreadPriority.Normal; 
    try 
    { 
     tp = System.Threading.Thread.CurrentThread.Priority; 

     System.Threading.Thread.CurrentThread.Priority = System.Threading.ThreadPriority.Highest; 

     System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); 
     sw.Start(); 
     SomeMethod(); 
     sw.Stop(); 
     Console.WriteLine("Time for SomeMethod = {0}ms", sw.ElapsedMilliseconds); 

     sw.Reset(); 
     sw.Start(); 
     SomeOtherMethod(); 
     sw.Stop(); 
     Console.WriteLine("Time for SomeOtherMethod= {0}ms", sw.ElapsedMilliseconds); 

     //... 
    } 
    finally 
    { 
     System.Threading.Thread.CurrentThread.Priority = tp; 
    } 
} 

यह मेरा कोड परिवर्तन करने के बाद अब लगातार तेजी से (~ 10ms) तब चलता है जब Console और Stopwatch लाइनों बाहर टिप्पणी की कर रहे हैं। इसलिए मेरा मानना ​​है कि कम से कम मेरी स्थिति में उनकी टिप्पणी शायद सही थी।

+0

ब्याज से, क्या होगा यदि आप कुछ विधि को सौ बार करना चाहते थे। मेरा अनुमान है कि सीपीयू थ्रॉटलिंग वास्तव में अपराधी है (प्रतीत होता है कंसोल.राइट द्वारा ठीक किया गया)। क्या आप उच्च प्रदर्शन मोड में हैं? संतुलित मोड 'स्पिन अप' में एक सेकंड लेगा - और यह पूर्ण टर्बो की गति भी शर्मीली होगी। और आप कहते हैं कि 10ms आपके लिए एक महत्वपूर्ण समय है, लेकिन धीमे कंप्यूटर पर कोड चलाए जाने पर 10ms आसानी से पेश किया जा रहा है। – Patrick

+0

@ पैट्रिक मेरा पीसी भयानक है इसलिए कोड को किसी भी चीज़ पर कभी भी नहीं चलना चाहिए। और मैंने कोड को फिर से शुरू किए बिना कई बार चलाया – TheLethalCoder

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