2015-04-22 19 views
7

असल में मैं इस बीट डिटेक्शन एल्गोरिदम पर काम कर रहा हूं, अजीब चीज़ जो मैं अभी सामना कर रहा हूं वह यह है कि जब मैं वर्क लोड को किसी अन्य थ्रेड पर विभाजित करता हूं। तो अब मेरे पास एक मुख्य धागा और एक और कार्यकर्ता धागा है। मेरा कार्यकर्ता धागा किसी भी तरह से मुख्य धागे की तुलना में तेज़ी से काम कर रहा है। यह अजीब लगता है क्योंकि मैंने जो सीखा है वह मुख्य धागा सैद्धांतिक रूप से हमेशा तेज होना चाहिए क्योंकि इसमें धागे को शुरू करने में समय नहीं लग रहा है। हालांकि मुझे जो भी मिलता है वह भी है कि मैं कार्यकर्ता थ्रेड के लिए अतिरिक्त 1024 नमूने पास करता हूं (वे वर्तमान में लगभग 30 मिलियन नमूने के साथ काम कर रहे हैं) यह मुख्य धागे से अभी भी तेज़ है। क्या ऐसा इसलिए है क्योंकि मेरे पास मेरे मुख्य धागे पर चल रहे अनुप्रयोग हैं? मैं अभी वास्तव में उलझन में हूँ। यहां कोडसी # मल्टीथ्रेडिंग अजीब व्यवहार

UnityEngine.Debug.Log ("T800 Start"); 
     Step3 s1= new Step3(); 
     Step3WOMT s2= new Step3WOMT(); 
     System.Object tempObj= samples2 as System.Object; 
     float[] tempArray = new float[eS.Length/ 2]; 
     System.Threading.ParameterizedThreadStart parameterizedts = new System.Threading.ParameterizedThreadStart(s1.DoStep3); 
     System.Threading.Thread T1 = new System.Threading.Thread(parameterizedts); 
     T1.Start (tempObj); 
     s2.DoStep3(samples1); 
     UnityEngine.Debug.Log ("s2"); 
     //UnityEngine.Debug.Log (stopwatch.ElapsedMilliseconds); 
     T1.Join(); 

चिंता न करें मैं केवल मल्टीथ्रेड में सी # सुविधाओं का उपयोग कर रहा हूं, इसलिए मुझे विश्वास है कि यह ठीक होना चाहिए। मैं वास्तव में उलझन में हूं कि अगर मैं T1.join() को टिप्पणी करता हूं; पूरी चीज को किसी भी तरह धीमा कर दें। मैं वास्तव में अभी उलझन में हूं क्योंकि इस सवाल का कोई उचित जवाब नहीं है।

+0

निश्चित रूप से, यदि एक धागा एक ही तर्क को दूसरे से तेज़ी से निष्पादित करता है तो ऐसा होता है क्योंकि उस धागे पर कम "प्रवेश" होता है। डब्ल्यूपीएफ (नेट) में। एफ। छेद यूआई मुख्य धागे पर होस्ट किया जाता है और एप्लिकेशन डिफ़ॉल्ट रूप से उस थ्रेड पर चलता है। उस ज्ञान के साथ अक्सर थ्रेड में वर्कलोड को साझा करने के लिए बहु-थ्रेडेड अनुप्रयोगों को बनाने के लिए समझदारी होती है ताकि उन्हें और अधिक करने की अनुमति मिल सके - या एक ही काम के लिए कम समय को कम करें। –

+0

हालांकि यह एक पागल बड़ा सौदा नहीं है 1503 मिलीसेकंड बनाम 1481 मिलीसेकंड, यह सिर्फ अजीब तरह का है। इसके अलावा वर्कर थ्रेड ऑब्जेक्ट को वापस फ्लोट करने के लिए ऑब्जेक्ट के रूप में भी कर रहा है []। तो क्या यह हमेशा मुख्य धागे से धीमा नहीं होना चाहिए? –

+0

'1503' और' 1481' एमएस के बीच वास्तव में कोई व्यावहारिक अंतर नहीं है। मुझे यह देखने में दिलचस्पी होगी कि आप अपना समय कैसे कर रहे हैं - शायद इसका असर भी हो। – Enigmativity

उत्तर

1

T1.join() सभी जादू करता है। यह मुख्य धागे को तब तक इंतजार करने की इजाजत देता है जब तक कि सभी कार्यकर्ता धागे पूर्ण नहीं हो जाते। क्या यह आवश्यक है? आपके आवेदन पर निर्भर करता है। यह एक मुख्य धागे के लिए अपने कार्यकर्ता धागे के निष्पादन के अंत की प्रतीक्षा करने की उम्मीद है।

0
  1. आपके सिस्टम में एकाधिक कोर होना चाहिए।
  2. यह संभव है कि Thread.Start थ्रेड प्रारंभ होने के तुरंत बाद वापस नहीं आ सकता है। वैसे भी आपको ThreadPool.EnqueueUserWorkItem और ManualResetEvent का उपयोग करने के बजाय प्रतीक्षा करने के लिए उपयोग करना चाहिए।
  3. वास्तविक परिणाम देखने के लिए आपके नमूने की गणना काफी बड़ी होनी चाहिए ताकि थ्रेड प्रारंभिक समय आपके कोड के निष्पादन समय की तुलना में न्यूनतम हो। ThreadPool को अक्सर एक नया धागा शुरू करने की आवश्यकता नहीं है लेकिन यह अभी भी आपका कोड लॉन्च करने में कुछ समय लेता है। मुझे लगता है कि आपको उन कार्यों के लिए मल्टीथ्रेडिंग का उपयोग नहीं करना चाहिए जो < ~ 50ms लेता है।
  4. यदि आप बड़े नमूनों के लिए निष्पादन समय की तुलना करते हैं (कुछ सेकंड लेते हैं) तो आप देखेंगे कि मुख्य धागे के प्रदर्शन और पृष्ठभूमि में कोई अंतर नहीं है (जब तक कि मुख्य धागे की उच्च प्राथमिकता न हो)।
संबंधित मुद्दे