7

से तेज चल रहा है मेरे पास विंडोज़ फॉर्म एप्लिकेशन बिल्कुल 2 थ्रेड के साथ है। इन धागे में एक-दूसरे के साथ शून्य बातचीत होती है, आला पहला धागा दूसरे थ्रेड के साथ गड़बड़ किए बिना चलता है। उनके बीच कोई सिंक्रनाइज़ेशन नहीं है, क्योंकि ऐसा होने की कोई आवश्यकता नहीं है। पहला थ्रेड एप्लिकेशन के यूआई, रंगों और लेबल बदलने के साथ संबंधित है और इसमें कुछ टाइमर चलने वाला एक टाइमर है जो इस टाइमर को हर 200 मिलीसेकंडों को आग लगा देता है। दूसरा थ्रेड अधिक शामिल है और एप्लिकेशन को छोड़कर उपयोगकर्ता द्वारा बंद होने तक लगातार कोडिंग के माध्यम से चलता है।विजुअल स्टूडियो सी # 2010 एक्सप्रेस डीबग रिलीज

दूसरा थ्रेड पहले स्मृति से पढ़ता है और डेटा को एक सूची में संग्रहीत करता है, फिर कुछ गणना करने के लिए इस डेटा का उपयोग करता है। मेरे पास स्टॉपवॉच क्लास टाइमर है जो दूसरे थ्रेड के एक पुनरावृत्ति को पूरा करने में लगने वाले समय को मापने के लिए करता है। यह टाइमर रीसेट हो गया है और धागे की शुरुआत में ही शुरू किया गया था और थ्रेड को एक पुनरावृत्ति पूरा करने के बाद बंद कर दिया गया था और कंसोल पर मुद्रित किया गया था। यह वह जगह है जहां मुझे अपना प्रदर्शन डेटा मिल रहा है। मैं थ्रेड को कम से कम 1000 पुनरावृत्तियों के लिए चलाने की अनुमति दे रहा हूं और फिर पहले रन को छोड़कर औसत कर रहा हूं।

बिल्ड का DEBUG संस्करण, यह वह निर्माण है जो VSHOST द्वारा चलाया जाता है या जब कोई विजुअल स्टूडियो सी # 2010 एक्सप्रेस में F5 दबाता है। समय 0.00035s पर औसत औसत 0.35ms है।

जब एप्लिकेशन VSHOST के बाहर चलाया जाता है, तो या तो Ctrl-F5 को मारकर या .exe से अनुप्रयोग चलाकर बनाया जाता है जो निर्मित होने पर उत्पादित होता है। मैंने पूरी तरह शून्य परिवर्तन के साथ इसका परीक्षण करने के लिए भी रिब्यूल्ड का उपयोग किया है। समय 365ms पर 365ms पर औसत औसत। यह रिलीज बिल्ड के साथ लगभग 1000x धीमी है।

मैं क्या हो रहा है के रूप में एक पूर्ण नुकसान पर हूं। VSHOST ऐसा क्या कर रहा है जो प्रोग्राम को इतनी जल्दी चलाने की अनुमति दे रहा है। मैंने यह सुनिश्चित कर लिया है कि सभी परिवर्तनीय प्रारंभिकता के लिए जिम्मेदार और सही है। ऐसा कहा जा रहा है कि मुझे कोई सुराग नहीं है कि ऐसा कुछ क्यों हो रहा है। मुझे कोई अंतर्दृष्टि क्यों मिल रही है कि मुझे ऐसा प्रदर्शन क्यों मिल रहा है?

एक साइड नोट के रूप में मैं जिस कंप्यूटर का उपयोग कर रहा हूं वह है 64 बिट में हाइपर थ्रेडिंग, 16 गीगाबाइट्स रैम और ट्विन एचडी 6750 के साथ क्वाड कोर i7 है। तो यह बहुत सारे धागे होने का मुद्दा प्रतीत नहीं होता है, यहां एकमात्र चीज है जो हाइपर थ्रेडिंग है।

मेरे आवेदन के रूप में कोड का एक स्निपेट। हालांकि काम कोड देना संभव नहीं है क्योंकि मेमोरी एड्रेस पढ़ा जाता है जहां धीमा हो जाता है।

namespace Test Snippet 
{ 
public struct Data 
{ 
    public float X; 
    public float Y; 
    public float Z; 
    public float dX; 
    public float dY; 

    public Data(int c) 
    { 
     this.X = ReadFloat(Base + 0x50 + (c * 0x10)); 
     this.Y = ReadFloat(Base + 0x50 + (c * 0x10)); 
     this.Z = ReadFloat(Base + 0x50 + (c * 0x10)); 
     if (this.Z == 1) 
     { 
      targetindex = c; 
     } 
     this.dX = 0; 
     this.dY = 0; 
    } 
} 
class Class1 
{ 
    public int Base = new int(); 
    public List<Data> data = new List<Data>(); 
    public int targetindex = new int(); 
    public Data targetdata = new Data(); 

    public void GetData() 
    { 
     while (true) 
     { 
      data.Clear(); 
      for (int c = 0; c < 64; c++) 
      { 
       Data tempdata = new Data(); 
       teampdata = new Data(c); 
       data.Add(tempdata); 
      } 
      if (data.Count != 0) 
      { 
       targetdata = data[targetindex]; 
       data.RemoveAt(targetindex); 
       targetdata.dX = ReadFloat(Base + 0x66); 
       targetdata.dY = ReadFloat(Base + 0x65); 
       Data[] tempdatarray = new Data[data.Count]; 
       for (int j = 0; j < tempdatarray.Length; j++) 
       { 
        tempdatarray[j].dX = (float)Math.Acos(targetdata.dX * 10); 
        tempdatarray[j].dY = (float)Math.Acos(targetdata.dY * 10); 
       } 
      } 

     } 
    } 
} 

}

संपादित :: मैं एक ही प्रक्रिया की कोशिश की लेकिन सूत्रण का उपयोग किए बिना किया है। मेरे पास टाइमर I द्वारा बुलाया गया थ्रेड फ़ंक्शन था जो उपयोगकर्ता इनपुट को पकड़ने के लिए उपयोग कर रहा था। मुझे एक ही परिणाम मिल रहा है। तो इसका मतलब है कि थ्रेडिंग समस्या नहीं प्रतीत होती है। मैंने एक अलग कंप्यूटर पर भी परीक्षण किया है और किसी कारण से मुझे भारी अंतर नहीं मिल रहा है। जो मुझे विश्वास दिलाता है कि मेरे कंप्यूटर के साथ कुछ गड़बड़ हो सकती है, या कुछ ऐसा है जो मेरे प्रोसेसर को हाइपर थ्रेडिंग क्षमता के कारण धागे से संबंधित करता है। किसी को पता है कि हाइपर थ्रेडिंग एक बहु-थ्रेडेड एप्लिकेशन के साथ समस्याएं पैदा करती है जो प्रोग्राम के भीतर से स्पष्ट रूप से इसका उपयोग नहीं कर रही है। जो ईमानदारी से मुझे एक सुराग नहीं होगा कि कैसे स्थापित किया जाए।

+2

क्या आपने वास्तविक प्रोफाइलिंग टूल के साथ एप्लिकेशन को प्रोफाइल करने का प्रयास किया था? –

+0

+1 एक अच्छी तरह से शोध, अच्छी तरह से लिखित प्रश्न – MikeKulls

+0

परीक्षण के लिए किसी भी कोड के बिना सलाह देने के लिए मुश्किल है। –

उत्तर

1

मुझे यह कहने के लिए कुछ भी नहीं दिख रहा है कि आप रिलीज बिल्ड का चयन कर रहे हैं। यह टूलबार पर एक विकल्प है। यदि आप सीधे डीबग बिल्ड चला रहे हैं तो शायद यह ऐसा कुछ ढूंढ रहा है जो इसे नहीं मिल रहा है।

संपादित करें: शीर्षक को छोड़कर जो मुझे याद आया !!!! :-)

+0

यह वास्तव में एक मजाकिया बिंदु है ... और मैं नहीं देख रहा हूं सुनिश्चित करें कि क्या समस्या के समापन पर इसका असर होगा, लेकिन @ माइककल्स के अनुसार, ** क्या आप वाकई रिलीज और असेंबली के संभावित रूप से अनुकूलित संस्करण चला रहे हैं?!? ** – fernandoespinosa

+0

एक और बिंदु: मान लीजिए उपर्युक्त कोई मुद्दा नहीं है, क्या आपके डीबग कॉन्फ़िगरेशन और आपके रिलीज़ कॉन्फ़िगरेशन दोनों में एक ही प्लेटफ़ॉर्म लक्ष्य है? – fernandoespinosa

+0

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

0

समस्या का हाइपर थ्रेडिंग से कोई लेना देना नहीं है।मुझे लिंक नहीं मिल रहा है, लेकिन इंटेल से 2004 तक यह एक अच्छा तकनीकी विवरण है कि यह कैसे काम करता है (बिना मार्केटिंग प्रचार के)। लेकिन इसका संक्षेप यह है: कोर 0 शायद एक असली कोर है और कोर 1 संभवतया एक लॉजिकल कोर है जो कोर 0 के समान हार्डवेयर साझा करता है। हमारे परिप्रेक्ष्य (ऐप देव) के लिए, कोर 0 और 1 दोनों असली हैं और हम नहीं करते हैं इस तथ्य की परवाह करना है कि कोर 1 एक तार्किक कोर है (स्पष्ट के अलावा, लॉजिकल कोर केवल कुल मिलाकर 13-30% परफ बढ़ावा देता है, फिर तकनीकी विवरण में इसका उल्लेख किया गया है)। विंडोज असली और लॉजिकल कोर में शेड्यूलिंग थ्रेड का एक बहुत अच्छा काम करता है। आपको बस दो धागे बनाने के लिए करना होगा, और विंडोज कोरस 0 और 1 पर प्रत्येक को चलाएंगे। आप BIOS में हाइपर थ्रेडिंग को अक्षम कर सकते हैं, अपने थ्रेड के लिए प्रोग्रामेटिक रूप से प्रोसेसर एफ़िनिटी सेट कर सकते हैं, या टास्क मैनेजर से एफ़िनिटी सेट कर सकते हैं, अगर आप चाहें प्रयोग करने के लिए।

कहा जा रहा है कि, हाइपर थ्रेडिंग के साथ प्रयोग करने से आपकी समस्या हल करने में मदद नहीं मिलेगी। आपको पहले से ही उल्लेख किया जाना चाहिए और रिलीज बिल्ड प्रोफाइल करना चाहिए। इवेंट लॉग में अजीब त्रुटियों को भी देखें। और यह देखने के लिए कि क्या I/O में बहुत अधिक समय व्यतीत किया गया है, सिसिनेरल प्रोसेस एक्सप्लोरर चलाएं। कौन जानता है, शायद रिलीज बिल्ड इस मशीन पर किसी डिवाइस ड्राइवर में कुछ विचित्र व्यवहार को ट्रिगर कर रहा है।

संपादित करें: यहाँ इंटेल की तकनीक का वर्णन (Yay विकिपीडिया) है, 2002 से वास्तव में है: http://download.intel.com/technology/itj/2002/volume06issue01/vol6iss1_hyper_threading_technology.pdf

1

तो सबसे पहले, आप कुछ प्रदर्शन की रूपरेखा क्या करना चाहिए। या तो एक प्रोफाइलिंग टूल का उपयोग करें या बस कुछ संदेशों को प्रिंट करने के लिए टाइमर का उपयोग करें, यह दिखाते हुए कि कुछ चीजें कितनी देर तक लेती हैं - इससे आपको कम से कम नाखून करने की अनुमति मिलनी चाहिए कि कोड की कौन सी रेखा धीरे-धीरे चल रही है, भले ही यह आपको नहीं बताए कि यह क्यों चल रहा है डीबगर के नीचे इतना धीमा। इस जानकारी के बिना आपके पास अनुमान है।

अब, अटकलबाजी पर ...

मैं इस समस्या अपेक्षाकृत कंसोल के उपयोग के साथ कुछ करने के लिए, इन टिप्पणियों

  • कंसोल विंडो में ही लेखन के आधार पर किया जाता है वास्तव में लगता है धीमा - आप यह एप्लिकेशन देखकर देख सकते हैं जो कंसोल पर बहुत सी चीजें लिखता है। यदि आप खिड़की को खोलते हैं तो इसे चलाने में काफी समय लगता है, हालांकि यदि आप कंसोल विंडो को कम करते हैं तो एक ही ऑपरेशन लॉट तेज चला सकता है।
  • जैसा कि मैं समझता हूं कि आप प्रत्येक 0.35ms कंसोल में 1 संदेश लिख रहे हैं। संदेशों की बहुत है।
  • इस पर निर्भर करते हुए कि आप अपना एप्लिकेशन कैसे चला रहे हैं विजुअल स्टूडियो वास्तव में कंसोल आउटपुट को डिस्गिंग के दौरान विजुअल स्टूडियो के अंदर "आउटपुट" विंडो पर रीडायरेक्ट करता है।

मेरा अनुमान है कि विजुअल स्टूडियो में कंसोल विंडो डीबगिंग के दौरान उपयोग की जाने वाली समतुल्य तंत्र से बहुत तेज है, और अतिरिक्त मंदी का कारण वास्तव में आपका लॉगिंग कोड है। अपने कंसोल आधारित लॉगिंग को निकालने का प्रयास करें और यह देखने के लिए फ़ाइल में लॉग इन करें कि यह कोई फर्क पड़ता है या यहां तक ​​कि संदेशों को लॉग इन करने की संख्या को कम करें। 100 पुनरावृत्तियों को पूरा करने में लगने वाले समय को लॉग करें - इससे आपके प्रदर्शन पर कंसोल होने पर प्रभाव (यदि कोई हो) कम हो जाएगा।

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