से तेज चल रहा है मेरे पास विंडोज़ फॉर्म एप्लिकेशन बिल्कुल 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 द्वारा बुलाया गया थ्रेड फ़ंक्शन था जो उपयोगकर्ता इनपुट को पकड़ने के लिए उपयोग कर रहा था। मुझे एक ही परिणाम मिल रहा है। तो इसका मतलब है कि थ्रेडिंग समस्या नहीं प्रतीत होती है। मैंने एक अलग कंप्यूटर पर भी परीक्षण किया है और किसी कारण से मुझे भारी अंतर नहीं मिल रहा है। जो मुझे विश्वास दिलाता है कि मेरे कंप्यूटर के साथ कुछ गड़बड़ हो सकती है, या कुछ ऐसा है जो मेरे प्रोसेसर को हाइपर थ्रेडिंग क्षमता के कारण धागे से संबंधित करता है। किसी को पता है कि हाइपर थ्रेडिंग एक बहु-थ्रेडेड एप्लिकेशन के साथ समस्याएं पैदा करती है जो प्रोग्राम के भीतर से स्पष्ट रूप से इसका उपयोग नहीं कर रही है। जो ईमानदारी से मुझे एक सुराग नहीं होगा कि कैसे स्थापित किया जाए।
क्या आपने वास्तविक प्रोफाइलिंग टूल के साथ एप्लिकेशन को प्रोफाइल करने का प्रयास किया था? –
+1 एक अच्छी तरह से शोध, अच्छी तरह से लिखित प्रश्न – MikeKulls
परीक्षण के लिए किसी भी कोड के बिना सलाह देने के लिए मुश्किल है। –