किस बिंदु पर एसिंक्रोनस रीडिंग ऑफ़ डिस्क I / O सिंक्रोनस से अधिक कुशल है?


22

यह मानते हुए कि कुछ कोड है जो कई उपभोक्ताओं के लिए फ़ाइलें पढ़ता है, और फाइलें किसी भी मनमाने आकार की हैं: किस आकार पर फ़ाइल को अतुल्यकालिक रूप से पढ़ना अधिक कुशल हो जाता है? या इसे दूसरे तरीके से रखने के लिए, इसके लिए एक फाइल कितनी छोटी होनी चाहिए ताकि इसे केवल तुल्यकालिक रूप से पढ़ा जा सके?

मैंने देखा है (और शायद मैं गलत हूं) कि बहुत छोटी फाइलें पढ़ते समय, उन्हें सिंक्रोनस (विशेष रूप से .NET के साथ) की तुलना में अतुल्यकालिक रूप से पढ़ने में अधिक समय लगता है। मैं यह मान रहा हूं कि मुझे I / O कंप्लीटेशन पोर्ट्स, थ्रेड्स आदि जैसी चीजों के लिए सेट अप समय देना होगा।

क्या यहां मदद करने के लिए अंगूठे का कोई नियम है? या यह व्यवस्था और पर्यावरण पर निर्भर है?


क्या आप बेंचमार्क के लिए उपयोग किए गए कोड दे सकते हैं? मुझे लगता है कि यह केवल उस स्थिति में हो सकता है जहां फ़ाइल आकार स्ट्रीम रीडर के आंतरिक बफर आकार से छोटा है। लेकिन अगर आपको यह पढना है कि कई छोटी फाइलें आपको शायद डिस्क i / o के साथ अन्य समस्याओं से
टकराएगी

मेरे पास कोड काम नहीं है, मुझे डर है। यह कुछ ऐसा है जो मैं थोड़ी देर में भाग गया और यह तब से मेरे दिमाग में है। कोड नेट में था और अनिवार्य रूप से एक सीधे File.ReadAllBytes में एक पाश के लिए बनाम FileStream.BeginRead () था ()
blesh

जब वक्र जो अपनी दक्षता क्रॉस का प्रतिनिधित्व करते हैं, और एसिंक्स आईओ सिंक IO वक्र की तुलना में अधिक मूल्य पर क्रॉसिंग से बाहर निकलता है।
थॉमस एडिंग

जवाबों:


14

दुर्भाग्य से, जवाब है, "यह निर्भर करता है।" आपके लिए एक छोटा सा प्रोग्राम लिखना आसान होगा, जो एसिंक्रोन और सिंक रीड्स दोनों के समय को समान रूप से निर्धारित करता है।

यह बहुत सारे कारकों पर निर्भर करेगा। क्या वे कताई डिस्क, एसएसडी या नेटवर्क ड्राइव पर संग्रहीत हैं? आप किस तरह का CPU इस्तेमाल कर रहे हैं? कितने सॉकेट / कोर? क्या आप एक वीएम या नंगे धातु में चल रहे हैं? क्या आप एक प्राचीन ओएस या आधुनिक चला रहे हैं?


1
हाँ, मुझे लगा। मुझे लगता है कि मैं उम्मीद कर रहा था कि गाइड या अंगूठे के नियम के रूप में उपयोग करने के लिए किसी प्रकार का अध्ययन था।
शरीर

9

Async के 3 मुख्य लाभ हैं:

  1. यह CPU उपयोग को कम करता है। यह उपयोगी हो सकता है यदि आप केवल पढ़ने वाले डेटा के साथ सीपीयू-भारी संचालन कर रहे हैं।
  2. कुछ प्रकार के एसिंक्रोनस इन्फ्रास्ट्रक्चर का उपयोग करने से कोड को पार्लेलाइज करना आसान हो जाता है। खासकर यदि आप बहुत सारी फाइलें पढ़ रहे हैं।
  3. ओएस, ओएस और एचडब्ल्यू को कई रीड-राइट अनुरोध भेजकर उन कार्यों को तेजी से पूरा करने का आदेश दे सकते हैं। SATA2 में ऐसी सुविधा है।

मेरा मानना ​​है कि एसिंक्रोनस रीड का मुख्य लाभ यह है कि जब आप बहुत सारी फाइलों के साथ काम कर रहे होते हैं या आपको बहुत सारी सीपीयू पावर की जरूरत होती है।


बिंदु 2 के लिए ध्यान दें कि यह कुछ भी अनुकूलित नहीं करेगा यदि I / O ऑपरेशन अड़चन है। यदि आप समानांतर में पहुंच रहे हैं, तो अलग-अलग हैं, RAID या नेटवर्क के माध्यम से, फाइलें जो विभिन्न डिस्क पर स्थित हैं।
आर्सेनी मूरज़ेंको

5
हम्म, मुझे यह समझने में परेशानी हो रही है कि आपका # 1 से क्या मतलब है। मैं कहता हूं कि यह व्यवहार में अन्य तरीका है। क्योंकि async केस के साथ, आप अब blocked waiting for I/O(0% CPU) से continue normal processing(> 0% CPU) में अपना थ्रेड बदल रहे हैं ।
इसक सावो

3

निर्भर करता है

एक बात का ध्यान रखें कि प्रक्रियाओं के बीच संदर्भ स्विच कितना महंगा है। Node.JS को इस तरह से डिज़ाइन किया गया है क्योंकि यह मानता है कि एक संदर्भ स्विच करना बहुत महंगा है और आपके पास IE पर प्रतीक्षा करने की बहुत सारी प्रक्रियाएं होंगी जो कंप्यूटर को बंद कर देंगी।

दूसरी ओर एर्लैंग एक प्रक्रिया संदर्भ स्विच को बहुत सस्ता बना देता है ताकि सब कुछ सिंक्रोनस हो सके और एर्लैंग रन टाइम पूरी चीज़ का ट्रैक रख सके।

तो विचार करने के कारक:

  • एक संदर्भ स्विच ऑपरेशन की लागत
  • संचालन के लिए डिस्क की गति
  • रीड ऑपरेशन के लिए डिस्क की गति
  • कैश में फ़ाइलें हैं

और मुझे यकीन है कि मैं आधा दर्जन कारकों को छोड़ रहा हूं


2

मुझे यकीन नहीं है कि एक विशेष "बिंदु" है, लेकिन यह सबसे अधिक समझ में आता है जब आपको बहुत सारे धागे काम कर रहे होते हैं, क्योंकि यह आपको अन्य कार्यों के साथ अपने I / O को ओवरलैप करने की अनुमति देता है। यदि आपको अतिरिक्त थ्रेड बेकार हो रहे हैं, तो अतुल्यकालिक रूप से पढ़ने से आपको कोई फायदा नहीं होने वाला है। यह केवल तभी है जब आपको काम की कतारें भरनी हों और आपका धागा I / O की प्रतीक्षा करने के बजाय उपयोगी रूप से अन्य काम कर सकता हो जिससे कि async फ़ाइल का उपयोग कोई लाभ दे सके।


हाँ, यह मल्टीथ्रेडिंग का पूरा बिंदु है!
Vlad

1

मुझे लगता है कि यहाँ समस्या इतनी अधिक पढ़ने की गति नहीं है, जितनी कि यह विलंबता है।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.