2012-10-01 16 views
6

इससे पहले मैंने क्लाइंट या सेवा पर Async-Await लागू करने से संबंधित this प्रश्न पोस्ट किया है। इस प्रश्न के साथ आगे बढ़ने से पहले प्रश्न पढ़ें क्योंकि यह कड़ाई से सवाल के साथ मिलकर है।Async-Await के वास्तविक फायदे?

उत्तर के आधार पर मैंने सी # 4.0 (टीपीएल) और सी # 5.0 (Async - Await) के लिए कोड का परीक्षण किया है। मैं सेवा द्वारा प्रदान की गई विधि के एसिंक और सिंक संस्करण का उपयोग करके सेवा को कॉल कर रहा हूं और प्रत्येक मामले में उपयोग किए गए थ्रेड की संख्या की तुलना कर रहा हूं। के बाद कोड मैं परीक्षण करने के लिए संसाधनों का इस्तेमाल किया उपयोग कर रहा हूँ है:

मुख्य विधि

List<Task<string>> tasksList = new List<Task<string>>(); 
List<int> asyncThreads = new List<int>(); 
List<int> tplThreads = new List<int>(); 
Stopwatch watch = new Stopwatch(); 
watch.Start(); 

// Call the Async version of the method 
for (int i = 0; i < 500; i++) 
{ 
    tasksList.Add(GetNameFromServiceAsync("Input" + i.ToString(), asyncThreads)); 
} 

Task.WaitAll(tasksList.ToArray()); 

watch.Stop(); 

foreach (var item in asyncThreads.Distinct()) 
{ 
    Console.WriteLine(item); 
} 

Console.WriteLine("(C# 5.0)Asynchrony Total Threads = " + asyncThreads.Distinct().Count()); 
Console.WriteLine(watch.ElapsedMilliseconds.ToString()); 

watch.Restart(); 

tasksList.Clear(); 

// Call the normal method 
for (int i = 0; i < 500; i++) 
{ 
    tasksList.Add(GetNameFromService("Input" + i.ToString(), tplThreads)); 
} 

Task.WaitAll(tasksList.ToArray()); 

watch.Stop(); 

foreach (var item in tplThreads.Distinct()) 
{ 
    Console.WriteLine(item); 
} 

Console.WriteLine("(C# 4.0)TPL Total Threads" + tplThreads.Distinct().Count()); 

Console.WriteLine(watch.ElapsedMilliseconds.ToString()); 

Async और समन्वयन सेवा के लिए कॉल

static async Task<string> GetNameFromServiceAsync(string name, List<int> threads) 
{ 
    Console.WriteLine(" Start Current Thread : " + System.Threading.Thread.CurrentThread.ManagedThreadId); 
    var task = await client.GetNameAsync(name); 
    threads.Add(System.Threading.Thread.CurrentThread.ManagedThreadId); 
    // Console.WriteLine("End GetNameFromServiceAsync Current Thread : " + System.Threading.Thread.CurrentThread.ManagedThreadId); 
    return task; 
} 

static Task<string> GetNameFromService(string name, List<int> threads) 
{ 

    var task = Task<string>.Factory.StartNew(() => 
     { 
      threads.Add(System.Threading.Thread.CurrentThread.ManagedThreadId); 
     // Console.WriteLine("GetNameFromService Current Thread : " + System.Threading.Thread.CurrentThread.ManagedThreadId); 
      return client.GetName(name); 
     }); 

    return task; 
} 

अब मैं है उत्तर पर काम किया और निम्नलिखित परिणाम प्राप्त करें:

  • यदि मैं सेवा में 500 कॉल करता हूं तो यह केवल 4-5 धागे का उपयोग करता है।
  • टीपीएल कॉल लगभग 44-45 धागे बनाता है।
  • Async कॉल के लिए समय लगभग 17 - 18 सेकंड
  • टीपीएल कॉल के लिए समय लगभग 42 - 45 सेकंड है।

मैं अपने निष्कर्षों पर कुछ प्रतिक्रिया देना चाहता हूं ताकि यह अन्य समुदाय के सदस्यों के लिए भी उपयोगी हो सके। क्या यह मेरे पहले के सवाल का जवाब है ??

संपादित

मेरे अवलोकन प्र निष्कर्ष निकाला है कि अगर हम Async-का इंतजार करने के बजाय TPL के Task.Factory.startNew उपयोग करते हैं, तो यह कम धागे की खपत होगी। यह कैसे सही है? यदि नहीं, तो इस तरह की तुलना के साथ सही दिशा क्या है?

प्रश्न: जैसा कि मैं async सीख रहा हूं - प्रतीक्षा करें, मैं कुछ प्रकार की तुलना और ठोस कोड द्वारा अपना मूल्य साबित करना चाहता हूं।

+8

आपका प्रश्न वास्तव में क्या है? –

+0

async का उपयोग करके - प्रतीक्षा करें हम मेमोरी फायदे प्राप्त कर सकते हैं (कम संसाधनों का उपयोग किया जाएगा)। यही वह है जो मुझे अपने पहले के प्रश्न से मिला था या जो मैं समझ गया था और मैं जानना चाहता हूं कि इसका उत्तर है। मैं async-await का उपयोग कर स्केलेबिलिटी फायदे के संदर्भ में पूछना चाहता हूं। क्या मैंने यह निष्कर्ष निकाला है कि मैंने क्या निष्कर्ष निकाला है? –

+0

एक महत्वपूर्ण लाभ और यह स्पष्ट है कि उपयोगकर्ता यह नहीं कह सकते कि उन्हें सिंक्रोनस कोड होने पर एसिंक्रोनस समस्या का सामना करना पड़ा। –

उत्तर

12

क्लाइंट-साइड async (तुल्यकालिक कोड की तुलना में) आम तौर पर स्मृति के लागत पर प्रतिक्रियाशीलता में सुधार करता है।

सर्वर-साइड async (तुल्यकालिक कोड की तुलना में) आम तौर पर स्मृति/थ्रेड उपयोग को कम करके स्केलेबिलिटी में सुधार करता है। ये फायदे क्लाइंट-साइड async (मल्टीथ्रेड कोड की तुलना में) पर भी लागू होते हैं।

इनमें से दोनों चरम सामान्यीकरण हैं और निश्चित रूप से ऐसी स्थितियां हैं जहां वे गलत हैं।

अद्यतन:

मेरे अवलोकन निष्कर्ष निकाला है कि अगर हम Async-का इंतजार ... उपयोग करते हैं, तो यह कम धागे की खपत होगी।

async/await बनाए रखने योग्य असीमित कोड सक्षम करें। अपने आप से, धागे बनाने के साथ उनके पास कुछ भी नहीं है।हालांकि, पृष्ठभूमि कार्यों को बनाने के लिए उन्हें अक्सर Task.Run (या Task.Factory.StartNew) के साथ उपयोग किया जाता है।

जैसा कि मैं async सीख रहा हूं - प्रतीक्षा करें, मैं कुछ प्रकार की तुलना और ठोस कोड द्वारा अपना मूल्य साबित करना चाहता हूं।

async और await संकलक परिवर्तन हैं। वे एसिंक्रोनस प्रोग्राम लिखना आसान बनाते हैं - यह सब कुछ है।

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

+0

धन्यवाद स्टीफन। मैंने अपना प्रश्न अपडेट कर लिया है। –

+0

अद्यतन उत्तर। –

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