2012-05-09 13 views
9

मेरे पास एक वर्ग है, "MyComputation" कहें जो एक लंबे कन्स्ट्रक्टर में बहुत अधिक गणना करता है। जब इसे स्वयं निष्पादित किया जाता है (कोई डिस्क i/o या नेटवर्क ऑपरेशंस के साथ) आमतौर पर चलाने के लिए लगभग 20ms लगता है। इस वर्ग की 100 दृष्टांत एक माता पिता के वर्ग द्वारा बनाई गई हैं, कहते हैं कि "ComputeParent" है, जो उन्हें काम आइटम के रूप में एक ThreadPool में कतार:सी # थ्रेडपूल एप्लिकेशन प्रदर्शन समय के साथ घट रहा है

ThreadPool.QueueUserWorkItem(myComputationCall, my_computation_data); 

"myComputationCall" इस तरह दिखता है:

public static void myComputationCall(Object my_computation_data) 
    { 
     try 
     { 
      MyDataObject data = (MyDataObject)my_computation_data; 

      var computation_run = new MyComputation(data.parameter1, data.parameter2); 

      data.result = computation_run.result; 
     } 
     finally 
     { 
      if (Interlocked.Decrement(ref num_work_items_remaining) == 0) 
       done_event.Set(); 
     } 
    } 

private static ManualResetEvent done_event; 

    ... 

    done_event = new ManualResetEvent(false); 

मैं ComputeParent के बारे में 500 या बार चलाने के लिए, विभिन्न इनपुट पैरामीटर के लिए:

done_event एक स्थिर ManualResetEvent है। तो मेरे पास बहुत घोंसला वाले वर्ग हैं। समस्या यह है कि ComputeParent को निष्पादित करने में लगने वाला समय धीरे-धीरे बढ़ता है। प्रत्येक विशेष कंप्यूटेंट को चलाने में कितना समय लगता है, इसके बीच एक निश्चित मात्रा में भिन्नता होगी, लेकिन समय की मात्रा काफी तेजी से बढ़ जाती है (ज्यामितीय रूप से, प्रत्येक क्रमिक पुनरावृत्ति लंबे समय तक अधिक समय लेती है)।

कार्यक्रम की स्मृति खपत काफी समय के साथ बढ़ती नहीं है हालांकि यह काफी अधिक है (~ 300 एमबी)। यह 8 लॉजिकल कोर वाले कंप्यूटर पर चल रहा है, और प्रोसेसर का उपयोग बहुत विस्फोटक प्रतीत होता है। मुझे यकीन नहीं है कि समस्या के लिए और क्या प्रासंगिक हो सकता है।

मैं बैच फ़ाइलों के माध्यम से ComputeParent चलाने की इच्छा नहीं करना चाहूंगा, हालांकि यह होने पर समस्या उत्पन्न नहीं होती है।

+2

क्या कोई कारण है (जैसे .NET <4) टीपीएल का उपयोग न करें? –

+6

आपको प्रोफाइलिंग शुरू करनी चाहिए। मापने के लिए जानना है। यह जीसी गतिविधि, अन्य धागे, बढ़ाया जा सकता है ... इस कोड में कोई स्पष्ट सुराग नहीं है। –

+2

क्या आपने इसे प्रोफाइल करने का प्रयास किया है? मैं भी टीपीएल के उपयोग की सलाह देते हैं। – Simon

उत्तर

3

यदि थ्रेडपूल में उपलब्ध थ्रेड की संख्या 0 हो जाती है, और आप नए कार्य आइटम जोड़ना जारी रखते हैं तो नए जोड़े गए कार्य आइटम "प्रतीक्षा" करेंगे। इसका मतलब है कि आपका ComputeParent "myComputationCall" के उदाहरणों की प्रतीक्षा करेगा। अधिक से अधिक शुरू करना ComputeParent का कारण होगा कि उनका औसत निष्पादन समय बढ़ जाएगा।

0

इस प्रश्न का उत्तर दिया गया है। सभी पोस्टर के लिए धन्यवाद।

इसी तरह के मुद्दे वाले अन्य लोगों के लिए, मैं हेनक द्वारा सुझाए गए कार्य समांतर लाइब्रेरी का सुझाव दूंगा।