जवाबों:
Boost.Asio एक C ++ लाइब्रेरी है, जो नेटवर्किंग पर ध्यान देने के साथ शुरू हुई है, लेकिन इसकी अतुल्यकालिक I / O क्षमताओं को अन्य संसाधनों तक बढ़ाया गया है। इसके अतिरिक्त, Boost.Asio के साथ बूस्ट पुस्तकालयों का हिस्सा होने के कारण, इसका दायरा अन्य बूस्ट लाइब्रेरी के साथ दोहराव को रोकने के लिए थोड़ा संकुचित है। उदाहरण के लिए, Boost.Asio थ्रेड एब्स्ट्रैक्शन प्रदान नहीं करेगा, क्योंकि Boost.Thread पहले से ही एक प्रदान करता है।
दूसरी ओर, लिब्यू एक सी लाइब्रेरी है जिसे Node.js के लिए प्लेटफ़ॉर्म लेयर के रूप में डिज़ाइन किया गया है । यह विंडोज पर IOCP के लिए एक अमूर्तता प्रदान करता है , macOS पर kqueue और लिनक्स पर एपोल करता है। इसके अतिरिक्त, ऐसा लग रहा है कि इसके दायरे में थ्रेड, थ्रेडपूल और इंटर-थ्रेड संचार जैसे अमूर्त और कार्यक्षमता को शामिल करने के लिए थोड़ा बढ़ गया है।
उनके मूल में, प्रत्येक पुस्तकालय एक घटना लूप और अतुल्यकालिक I / O क्षमताओं को प्रदान करता है। वे कुछ बुनियादी सुविधाओं, जैसे टाइमर, सॉकेट्स और अतुल्यकालिक संचालन के लिए ओवरलैप हैं। libuv में एक व्यापक गुंजाइश है, और अतिरिक्त कार्यक्षमता प्रदान करता है, जैसे कि थ्रेड और सिंक्रोनाइज़ेशन एब्स्ट्रक्शन, सिंक्रोनस और एसिंक्रोनस फ़ाइल सिस्टम ऑपरेशंस, प्रोसेस मैनेजमेंट, आदि। इसके विपरीत, Boost.Asio की मूल नेटवर्किंग फ़ोकस सतहें, क्योंकि यह नेटवर्क से संबंधित एक समृद्ध सेट प्रदान करता है। क्षमताओं, जैसे कि ICMP, SSL, सिंक्रोनस ब्लॉकिंग और नॉन-ब्लॉकिंग ऑपरेशंस, और सामान्य कार्यों के लिए उच्च-स्तरीय संचालन, जिसमें एक स्ट्रीम से रीडिंग शामिल है जब तक कि एक नई पंक्ति प्राप्त नहीं होती है।
यहां कुछ प्रमुख विशेषताओं की तुलना की गई है। चूंकि Boost.Asio का उपयोग करने वाले डेवलपर्स के पास अक्सर अन्य बूस्ट लाइब्रेरी उपलब्ध होती हैं, इसलिए मैंने अतिरिक्त बूस्ट पुस्तकालयों पर विचार करने का विकल्प चुना है यदि वे सीधे लागू किए गए हैं या लागू करने के लिए तुच्छ हैं।
लिबाव बूस्ट इवेंट लूप: हाँ एसियो थ्रेडपूल: हाँ एसियो + थ्रेड्स थ्रेडिंग: धागे: हाँ धागे सिंक्रनाइज़ेशन: हाँ थ्रेड्स फ़ाइल सिस्टम ऑपरेशन: सिंक्रोनस: हां फाइलसिस्टम एसिंक्रोनस: हाँ एसियो + फाइलसिस्टम टाइमर: हाँ Asio स्कैटर / इकट्ठा I / O [1] : नो एसियो नेटवर्किंग: ICMP: नो एसियो DNS रिज़ॉल्यूशन: async-only Asio एसएसएल: नो एसियो टीसीपी: एसिंक्स-ओनली एसियो यूडीपी: एसिंक्स-ओनली एसियो सिग्नल: हैंडलिंग: हाँ Asio भेजना: हाँ नहीं भारतीय दंड संहिता: यूनिक्स डोमेन सॉकेट: हाँ एसियो विंडोज नामांकित पाइप: हाँ एसियो प्रक्रिया प्रबंधन: कोचिंग: हाँ प्रक्रिया मैं / हे पाइप: हाँ प्रक्रिया स्पॉनिंग: हाँ प्रक्रिया सिस्टम क्वेरी: सीपीयू: हाँ नहीं नेटवर्क इंटरफ़ेस: हाँ नहीं सीरियल पोर्ट: नहीं हां TTY: हाँ नहीं साझा पुस्तकालय लोड हो रहा है: हाँ एक्सटेंशन [2]
2. Boost.Extension को बूस्ट की समीक्षा के लिए कभी प्रस्तुत नहीं किया गया था। जैसा कि यहां बताया गया है , लेखक इसे पूर्ण मानता है।
हालांकि दोनों लिबव और बूस्ट.एसियो इवेंट लूप प्रदान करते हैं, दोनों के बीच कुछ सूक्ष्म अंतर हैं:
uv_default_loop()नए लूप ( uv_loop_new()) बनाने के बजाय डिफ़ॉल्ट लूप ( ) का उपयोग करते समय देखभाल की आवश्यकता होती है , क्योंकि एक अन्य घटक डिफ़ॉल्ट लूप को चला रहा हो सकता है।io_serviceअपने स्वयं के लूप हैं जो कई थ्रेड को चलाने की अनुमति देते हैं। इस Boost.Asio का समर्थन करने के लिए कुछ प्रदर्शन की कीमत पर आंतरिक लॉकिंग करता है । Boost.Asio का संशोधन इतिहास बताता है कि लॉकिंग को कम करने के लिए कई प्रदर्शन सुधार हुए हैं।uv_queue_work। थ्रेडपूल का आकार पर्यावरण चर के माध्यम से कॉन्फ़िगर करने योग्य है UV_THREADPOOL_SIZE। कार्य को इवेंट लूप के बाहर और थ्रेडपूल के भीतर निष्पादित किया जाएगा। एक बार काम पूरा हो जाने के बाद, पूरा हैंडलर इवेंट लूप के भीतर चलने के लिए कतारबद्ध हो जाएगा।io_serviceआसानी से एक के रूप में कार्य io_serviceकरने के लिए कई सूत्र अनुमति देने के परिणामस्वरूप कार्य कर सकता है run। यह उपयोगकर्ता को थ्रेड प्रबंधन और व्यवहार की जिम्मेदारी देता है, जैसा कि इस उदाहरण में देखा जा सकता है ।EAGAINया जाँच करनी चाहिए EWOULDBLOCK।killअपने uv_signal_tप्रकार और uv_signal_*संचालन के साथ एक अमूर्त और सिग्नल हैंडलिंग प्रदान करता है ।kill, लेकिन इसकी signal_setसिग्नल हैंडलिंग प्रदान करता है।uv_pipe_t ।local::stream_protocol::socketया local::datagram_protocol::socket, और windows::stream_handle।जबकि API अकेले भाषा के आधार पर भिन्न होते हैं, यहाँ कुछ प्रमुख अंतर हैं:
Boost.Asio के भीतर, एक ऑपरेशन और एक हैंडलर के बीच एक-से-एक मैपिंग है। उदाहरण के लिए, प्रत्येक async_writeऑपरेशन एक बार WriteHandler को आमंत्रित करेगा । यह कई लिब्यू ऑपरेशंस और हैंडलर्स के लिए सही है। हालांकि, लिबाव uv_async_sendकई-से-एक मैपिंग का समर्थन करता है। एकाधिक uv_async_sendकॉलों के परिणामस्वरूप uv_async_cb को एक बार कॉल किया जा सकता है ।
कार्य के साथ काम करते समय, जैसे कि एक स्ट्रीम / यूडीपी से पढ़ना, संकेतों को संभालना, या टाइमर पर प्रतीक्षा करना, Boost.Asio की एसिंक्रोनस कॉल चेन कुछ अधिक स्पष्ट हैं। लिब्यू के साथ, एक विशेष घटना में हितों को नामित करने के लिए एक चौकीदार बनाया जाता है। चौकीदार के लिए एक लूप शुरू किया जाता है, जहां कॉलबैक प्रदान किया जाता है। हितों की घटना प्राप्त होने पर, कॉलबैक आमंत्रित किया जाएगा। दूसरी ओर, Boost.Asio को हर बार आवेदन जारी करने के लिए एक ऑपरेशन की आवश्यकता होती है, जो इवेंट को संभालने में रुचि रखता है।
इस अंतर को समझने में मदद करने के लिए, यहां Boost.Asio के साथ एक अतुल्यकालिक रीड लूप है, जहां async_receiveकॉल को कई बार जारी किया जाएगा:
void start()
{
socket.async_receive( buffer, handle_read ); ----.
} |
.----------------------------------------------'
| .---------------------------------------.
V V |
void handle_read( ... ) |
{ |
std::cout << "got data" << std::endl; |
socket.async_receive( buffer, handle_read ); --'
}
और यहाँ लिब्युव के साथ एक ही उदाहरण है, जहाँ handle_readहर बार देखने वाले को यह पता चलता है कि सॉकेट में डेटा है:
uv_read_start( socket, alloc_buffer, handle_read ); --.
|
.-------------------------------------------------'
|
V
void handle_read( ... )
{
fprintf( stdout, "got data\n" );
}
Boost.Asio में एसिंक्रोनस कॉल चेन और libuv में देखने वालों के परिणामस्वरूप, मेमोरी आवंटन अक्सर अलग-अलग समय पर होता है। चौकीदारों के साथ, लिबवू आवंटन को तब तक आबंटित करता है जब तक कि उसे एक ऐसी घटना न मिल जाए जिसे संभालने के लिए स्मृति की आवश्यकता होती है। आवंटन एक उपयोगकर्ता कॉलबैक के माध्यम से किया जाता है, जो आंतरिक रूप से लीवुव पर लगाया जाता है, और आवेदन की अस्वीकृति की जिम्मेदारी को समाप्त करता है। दूसरी ओर, कई Boost.Asio ऑपरेशंस के लिए यह आवश्यक है कि मेमोरी को एसिंक्रोनस ऑपरेशन जारी करने से पहले आवंटित किया जाए, जैसे कि केस के bufferलिए async_read। Boost.Asio प्रदान करता है null_buffers, जिसका उपयोग किसी ईवेंट को सुनने के लिए किया जा सकता है, जिससे एप्लिकेशन को मेमोरी आवंटन को स्थगित करने की अनुमति मिलती है, जब तक कि मेमोरी की आवश्यकता नहीं होती है।
यह मेमोरी एलोकेशन अंतर भी खुद को bind->listen->acceptलूप के भीतर प्रस्तुत करता है । Libuv के साथ, uv_listenएक ईवेंट लूप बनाता है जो उपयोगकर्ता कॉलबैक को आमंत्रित करेगा जब कोई कनेक्शन स्वीकार करने के लिए तैयार हो। यह एप्लिकेशन को क्लाइंट के आवंटन को स्थगित करने की अनुमति देता है जब तक कि कनेक्शन का प्रयास नहीं किया जाता है। दूसरी ओर, Boost.Asio listenकेवल की स्थिति को बदलता है acceptor। async_acceptकनेक्शन घटना के लिए सुनता है, और साथियों की आवश्यकता लागू किए जाने से पहले आवंटित किया जाना है।
दुर्भाग्य से, मेरे पास libuv और Boost.Asio की तुलना करने के लिए कोई ठोस बेंचमार्क संख्या नहीं है। हालाँकि, मैंने वास्तविक समय और निकट-वास्तविक समय के अनुप्रयोगों में पुस्तकालयों का उपयोग करके इसी तरह के प्रदर्शन को देखा है। यदि हार्ड नंबर वांछित हैं, तो libuv का बेंचमार्क टेस्ट शुरुआती बिंदु के रूप में काम कर सकता है।
इसके अतिरिक्त, जबकि वास्तविक अड़चनों की पहचान करने के लिए प्रोफाइलिंग की जानी चाहिए, स्मृति आवंटन के बारे में जागरूक रहें। कामेच्छा के लिए, मेमोरी आवंटन रणनीति मुख्य रूप से आवंटनकर्ता कॉलबैक तक सीमित है। दूसरी ओर, Boost.Asio का एपीआई एक एलोकेटर कॉलबैक के लिए अनुमति नहीं देता है, और इसके बजाय आवंटन रणनीति को आवेदन में धकेल देता है। हालाँकि, Boost.Asio में हैंडलर / कॉलबैक की प्रतिलिपि बनाई जा सकती है, आबंटित की जा सकती है, और डील-डौल की जा सकती है। Boost.Asio हैंडलर के लिए मेमोरी आवंटन रणनीति को लागू करने के लिए कस्टम मेमोरी आवंटन कार्यों को प्रदान करने के लिए अनुप्रयोगों की अनुमति देता है ।
आसियो के विकास में कम से कम ओसीटी -2004 की तारीखें आती हैं, और इसे 20-दिन की पीयर समीक्षा के बाद 22-मार्च -2016 को बूस्ट 1.35 में स्वीकार किया गया। यह TR2 के लिए नेटवर्किंग लाइब्रेरी प्रस्ताव के संदर्भ कार्यान्वयन और एपीआई के रूप में भी कार्य करता है । Boost.Asio के पास उचित मात्रा में प्रलेखन है , हालांकि इसकी उपयोगिता उपयोगकर्ता से उपयोगकर्ता में भिन्न होती है।
एपीआई भी एक काफी सुसंगत लग रहा है। इसके अतिरिक्त, ऑपरेशन के नाम में अतुल्यकालिक संचालन स्पष्ट हैं। उदाहरण के लिए, acceptसिंक्रोनस ब्लॉकिंग है और async_acceptएसिंक्रोनस है। उदाहरण के लिए, आम तौर पर I / O कार्य के लिए API नि: शुल्क फ़ंक्शन प्रदान करता है, एक स्ट्रीम से पढ़ने के लिए जब तक \r\nपढ़ा नहीं जाता है। कुछ नेटवर्क विशिष्ट विवरणों को छिपाने के लिए ध्यान भी दिया गया है, जैसे ip::address_v4::any()"सभी इंटरफेस" के पते का प्रतिनिधित्व करना 0.0.0.0।
अंत में, बूस्ट 1.47+ हैंडलर ट्रैकिंग प्रदान करता है , जो डीबगिंग के साथ-साथ C ++ 11 समर्थन के लिए उपयोगी साबित हो सकता है।
उनके गितुब रेखांकन के आधार पर, Node.js का विकास कम से कम FEB-2009 , और libuv के विकास की तारीख MAR-2011 तक है । Uvbook एक libuv परिचय के लिए एक महान जगह है। एपीआई प्रलेखन यहाँ है ।
कुल मिलाकर, एपीआई काफी सुसंगत और प्रयोग करने में आसान है। एक विसंगति जो भ्रम का स्रोत हो सकती है, वह uv_tcp_listenहै द्रष्टा पाश। यह अन्य पर नजर रखने वालों कि आम तौर पर एक है से अलग है uv_*_startऔर uv_*_stopद्रष्टा लूप के जीवन को नियंत्रित करने के कार्यों की जोड़ी। इसके अलावा, कुछ uv_fs_*कार्यों में तर्कों की एक सभ्य राशि है (7 तक)। कॉलबैक (अंतिम तर्क) की उपस्थिति पर सिंक्रोनस और एसिंक्रोनस व्यवहार निर्धारित होने के साथ, सिंक्रोनस व्यवहार की दृश्यता कम हो सकती है।
अंत में, लिबव कमिट हिस्ट्री पर एक त्वरित नज़र से पता चलता है कि डेवलपर्स बहुत सक्रिय हैं।
uv_async_sendकॉल को जमा कर सकती है , और उन सभी को एक कॉलबैक से संभाल सकती है। यह यहाँ प्रलेखित है । साथ ही सभी का धन्यवाद।
ठीक। मुझे दोनों पुस्तकालयों का उपयोग करने का कुछ अनुभव है और कुछ चीजों को स्पष्ट कर सकता हूं।
सबसे पहले, एक वैचारिक दृष्टिकोण से ये पुस्तकालय डिजाइन में काफी भिन्न हैं। उनके पास अलग-अलग आर्किटेक्चर हैं, क्योंकि वे अलग-अलग पैमाने के हैं। Boost.Asio टीसीपी / यूडीपी / आईसीएमपी प्रोटोकॉल, पोसिक्स, एसएसएल और इतने पर के साथ उपयोग करने के लिए लक्षित एक बड़ी नेटवर्किंग लाइब्रेरी है। Libuv , Node.js के लिए मुख्य रूप से IOCP के क्रॉस-प्लेटफ़ॉर्म अमूर्त के लिए एक परत है , मुख्य रूप से। इसलिए लिबवू कार्यात्मक रूप से Boost.Asio का एक उपसमूह है (केवल टीसीपी / यूडीपी सॉकेट थ्रेड्स, टाइमर की सामान्य विशेषताएं)। ऐसा होने के नाते, हम केवल कुछ मानदंडों का उपयोग करके इन पुस्तकालयों की तुलना कर सकते हैं:
नए C ++ फीचर्स के साथ एकीकरण: Asio बेहतर है (Asio 1.51 बड़े पैमाने पर C ++ 11 एसिंक्रोनस मॉडल, मूवमेंट्स, वैरेडिक टेम्प्लेट का उपयोग करें)। परिपक्वता के संबंध में, Asio अच्छे प्रलेखन के लिए एक अधिक स्थिर और परिपक्व परियोजना है (यदि इसकी तुलना libuv से करें। हेडर विवरण), इंटरनेट पर बहुत सी जानकारी (वीडियो वार्ता, ब्लॉग: http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostetio?pg) = 1 , आदि) और यहां तक कि किताबें (पेशेवरों के लिए नहीं, लेकिन फिर भी: http://en.highscore.de/cpp/boost/index.html )। Libuv में केवल एक ऑनलाइन पुस्तक है (लेकिन यह भी अच्छा है) http://nikhilm.github.com/uvbook/index.htmlऔर कई वीडियो वार्ता, इसलिए सभी रहस्यों को जानना मुश्किल होगा (यह पुस्तकालय उनमें से एक है)। कार्यों की अधिक विशिष्ट चर्चा के लिए मेरी टिप्पणियाँ नीचे देखें।
निष्कर्ष के रूप में, मुझे यह कहना चाहिए कि यह सब आपके उद्देश्यों, आपकी परियोजना और आप क्या करने का इरादा रखते हैं पर निर्भर करता है।
एक बहुत बड़ा अंतर असियो के लेखक (क्रिस्टोफर कोहल्हॉफ) अपनी लाइब्रेरी को C ++ स्टैंडर्ड लाइब्रेरी में शामिल करने के लिए तैयार कर रहे हैं, देखें http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2175 .pdf और http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4370.html
पोर्टेबिलिटी स्टेटस जोड़ना: इस उत्तर को पोस्ट करने और अपने स्वयं के प्रयासों के अनुसार: