c++ Libuv बूस्ट/एएसआईओ की तुलना कैसे करता है?




boost boost-asio (3)

ठीक। मुझे पुस्तकालयों का उपयोग करने में कुछ अनुभव है और कुछ चीजों को साफ़ कर सकता है।

सबसे पहले, एक वैचारिक दृष्टिकोण-बिंदु से ये पुस्तकालय डिजाइन में काफी अलग हैं। उनके पास विभिन्न आर्किटेक्चर हैं, क्योंकि वे अलग-अलग पैमाने पर हैं। Boost.Asio एक बड़ी नेटवर्किंग लाइब्रेरी है जिसका लक्ष्य टीसीपी / यूडीपी / आईसीएमपी प्रोटोकॉल, पॉज़िक्स, एसएसएल आदि के साथ किया जाना है। मुख्य रूप से नोड.जेएस के लिए आईओसीपी के क्रॉस-प्लेटफार्म अबास्ट्रक्शन के लिए लिबू सिर्फ एक परत है। तो libuv कार्यात्मक रूप से Boost.Asio का एक सबसेट है (सामान्य विशेषताएं केवल टीसीपी / यूडीपी सॉकेट थ्रेड, टाइमर)। ऐसा होने के नाते, हम केवल कुछ मानदंडों का उपयोग करके इन पुस्तकालयों की तुलना कर सकते हैं:

  1. नोड.जेएस के साथ एकीकरण - लिबव काफी बेहतर है क्योंकि इसका उद्देश्य है (हम इसे पूरी तरह से एकीकृत कर सकते हैं और सभी पहलुओं में उपयोग कर सकते हैं, उदाहरण के लिए, क्लाउड जैसे विंडोज़ एज़ूर)। लेकिन Asio भी लगभग समान कार्यक्षमता लागू करता है जैसे Node.js इवेंट कतार संचालित वातावरण में।
  2. आईओसीपी प्रदर्शन - मैं महान मतभेद नहीं देख सका, क्योंकि इन दोनों पुस्तकालयों में अंतर्निहित ओएस एपीआई है। लेकिन वे इसे एक अलग तरीके से करते हैं: एएसओ भारी रूप से सी ++ फीचर्स जैसे टेम्पलेट्स और कभी-कभी टीएमपी का उपयोग करता है। Libuv एक मूल सी पुस्तकालय है। लेकिन फिर भी आईओसीपी की एशियाई प्राप्ति बहुत ही कुशल है। असियो में यूडीपी सॉकेट पर्याप्त नहीं हैं, उनके लिए libuv का उपयोग करना बेहतर है।

    नई सी ++ सुविधाओं के साथ एकीकरण: एएसओ बेहतर है (एएसओओ 1.51 व्यापक रूप से सी ++ 11 असीमित मॉडल का उपयोग करें, अर्थशास्त्र, वैरिएडिक टेम्पलेट्स ले जाएं) परिपक्वता के संबंध में, असियो अच्छी प्रलेखन के साथ एक अधिक स्थिर और परिपक्व प्रोजेक्ट है (यदि इसकी तुलना libuv से करें हेडर विवरण), इंटरनेट पर बहुत सारी जानकारी (वीडियो वार्ता, ब्लॉग: http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio?pg=1 , आदि) और यहां तक ​​कि किताबें (पेशेवरों के लिए नहीं बल्कि फिर भी: http://en.highscore.de/cpp/boost/index.html )। लिबुव में केवल एक ऑनलाइन पुस्तक है (लेकिन यह भी अच्छी है) http://nikhilm.github.com/uvbook/index.html और कई वीडियो वार्ताएं, इसलिए सभी रहस्यों को जानना मुश्किल होगा (इस पुस्तकालय में उनमें से बहुत सारे हैं) । कार्यों की अधिक विशिष्ट चर्चा के लिए नीचे मेरी टिप्पणियां देखें।

निष्कर्ष के रूप में, मुझे यह कहना चाहिए कि यह सब आपके उद्देश्यों, आपकी परियोजना और आप क्या करना चाहते हैं पर निर्भर करता है।

मुझे इस तरह के पहलुओं में दिलचस्पी होगी:

  • गुंजाइश / सुविधाओं
  • प्रदर्शन
  • परिपक्वता


क्षेत्र

Boost.Asio एक सी ++ लाइब्रेरी है जो नेटवर्किंग पर ध्यान केंद्रित करने के साथ शुरू हुई, लेकिन इसकी एसिंक्रोनस I / O क्षमताओं को अन्य संसाधनों तक बढ़ा दिया गया है। इसके अतिरिक्त, Boost.Asio बूस्ट पुस्तकालयों का हिस्सा होने के साथ, अन्य बूस्ट पुस्तकालयों के साथ नकल को रोकने के लिए इसका दायरा थोड़ा संकुचित है। उदाहरण के लिए, Boost.Asio बूस्ट एस्ट्रस्ट्रक्शन प्रदान नहीं करेगा, बूस्ट के रूप में। Boost.Thread पहले से ही एक प्रदान करता है।

दूसरी तरफ, libuv एक सी पुस्तकालय है जो node.js लिए प्लेटफार्म परत बनने के लिए डिज़ाइन किया गया है। यह विंडोज के लिए libev और यूनिक्स सिस्टम पर libev लिए एक अमूर्त प्रदान करता है। यद्यपि this मुद्दे में उल्लेख किए गए libev को हटाने के प्रयास हैं। इसके अतिरिक्त, ऐसा लगता है कि इसके दायरे में थोड़े बढ़ गए हैं जैसे कि थ्रेड्स, थ्रेडपूल और इंटर-थ्रेड संचार जैसे अबास्ट्रक्शन और कार्यक्षमता शामिल हैं।

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

सुविधा की सूची

यहां कुछ प्रमुख विशेषताओं पर संक्षिप्त साइड-बाय-साइड तुलना है। चूंकि Boost.Asio का उपयोग करने वाले डेवलपर्स के पास अक्सर अन्य बूस्ट लाइब्रेरी उपलब्ध हैं, इसलिए मैंने अतिरिक्त बूस्ट लाइब्रेरी पर विचार करने का विकल्प चुना है यदि वे या तो सीधे प्रदान किए जाते हैं या लागू करने के लिए तुच्छ हैं।

                         libuv          Boost
Event Loop:              yes            Asio
Threadpool:              yes            Asio + Threads
Threading:              
  Threads:               yes            Threads
  Synchronization:       yes            Threads
File System Operations:
  Synchronous:           yes            FileSystem
  Asynchronous:          yes            Asio + Filesystem
Timers:                  yes            Asio
Scatter/Gather I/O[1]:    no             Asio
Networking:
  ICMP:                  no             Asio
  DNS Resolution:        async-only     Asio
  SSL:                   no             Asio
  TCP:                   async-only     Asio
  UDP:                   async-only     Asio
Signal:
  Handling:              yes            Asio
  Sending:               yes            no
IPC:
  UNIX Domain Sockets:   yes            Asio
  Windows Named Pipe:    yes            Asio
Process Management:
  Detaching:             yes            Process
  I/O Pipe:              yes            Process
  Spawning:              yes            Process
System Queries:
  CPU:                   yes            no
  Network Interface:     yes            no
Serial Ports:            no             yes
TTY:                     yes            no
Shared Library Loading:  yes            Extension[2]

1. स्कैटर / इकट्ठा I / O।

2. बूस्ट। बूस्ट को समीक्षा के लिए Boost.Extension कभी सबमिट नहीं किया गया था। जैसा कि here बताया गया here , लेखक इसे पूर्ण मानते हैं।

इवेंट लूप

जबकि libuv और Boost.Asio दोनों घटना loops प्रदान करते हैं, दोनों के बीच कुछ सूक्ष्म मतभेद हैं:

  • जबकि libuv एकाधिक ईवेंट लूप का समर्थन करता है, यह एकाधिक थ्रेड से उसी लूप को चलाने का समर्थन नहीं करता है। इस कारण से, एक नया लूप ( uv_loop_new() ) बनाने के बजाय डिफ़ॉल्ट लूप ( uv_default_loop() ) का उपयोग करते समय देखभाल की आवश्यकता होती है, क्योंकि कोई अन्य घटक डिफ़ॉल्ट पाश चला सकता है।
  • Boost.Asio डिफ़ॉल्ट लूप की धारणा नहीं है; सभी io_service उनके स्वयं के लूप हैं जो कई धागे चलाने की अनुमति देते हैं। इस बूस्ट का समर्थन करने के लिए। एसीओ कुछ performance की लागत पर आंतरिक लॉकिंग करता है। बूस्ट। एशिया के संशोधन history संकेत मिलता है कि लॉकिंग को कम करने के लिए कई प्रदर्शन सुधार हुए हैं।

धागा पूल

  • libuv's uv_queue_work के माध्यम से एक थ्रेडपूल प्रदान करता है। थ्रेडपूल आकार एक कार्यान्वयन विस्तार है, और एपीआई के माध्यम से विन्यास योग्य प्रतीत नहीं होता है। कार्य घटना लूप के बाहर और थ्रेडपूल के भीतर निष्पादित किया जाएगा। एक बार काम पूरा हो जाने के बाद, समापन हैंडलर को ईवेंट लूप के भीतर चलाने के लिए कतारबद्ध किया जाएगा।
  • जबकि Boost.Asio थ्रेडपूल प्रदान नहीं करता है, io_service आसानी से io_service परिणामस्वरूप एक के रूप में कार्य कर सकता है जो एकाधिक थ्रेड को run लिए अनुमति देता है। यह उपयोगकर्ता को थ्रेड प्रबंधन और व्यवहार की ज़िम्मेदारी रखता है, जैसा कि this उदाहरण में देखा जा सकता है।

थ्रेडिंग और सिंक्रनाइज़ेशन

  • libuv धागे और सिंक्रनाइज़ेशन प्रकारों के लिए एक अमूर्त प्रदान करता है।
  • Boost.Thread । थ्रेड थ्रेड और सिंक्रनाइज़ेशन प्रकार प्रदान करता है। इनमें से कई प्रकार C ++ 11 मानक के साथ बारीकी से पालन करते हैं, लेकिन कुछ एक्सटेंशन भी प्रदान करते हैं। Boost.Asio के परिणामस्वरूप एकाधिक थ्रेड को एक इवेंट लूप चलाने की इजाजत मिलती है, यह स्पष्ट लॉकिंग तंत्र का उपयोग किये बिना ईवेंट हैंडलर के अनुक्रमिक आमंत्रण को बनाने के साधन के रूप में strands प्रदान करता है।

फाइल सिस्टम ऑपरेशंस

  • libuv कई फाइल सिस्टम संचालन के लिए एक अमूर्त प्रदान करता है। प्रति ऑपरेशन एक समारोह है, और प्रत्येक ऑपरेशन या तो सिंक्रोनस अवरोध या असीमित हो सकता है। यदि कॉलबैक प्रदान किया जाता है, तो ऑपरेशन को आंतरिक थ्रेडपूल के भीतर असीमित रूप से निष्पादित किया जाएगा। यदि कॉलबैक प्रदान नहीं किया जाता है, तो कॉल सिंक्रोनस अवरोधन होगा।
  • Boost.Filesystem कई फाइल सिस्टम संचालन के लिए सिंक्रोनस अवरुद्ध कॉल प्रदान करता है। इन्हें एसिंक्रोनस फ़ाइल सिस्टम ऑपरेशंस बनाने के लिए Boost.Asio और थ्रेडपूल के साथ जोड़ा जा सकता है।

नेटवर्किंग

  • libuv यूडीपी और टीसीपी सॉकेट, साथ ही DNS संकल्प पर एसिंक्रोनस संचालन का समर्थन करता है। एप्लिकेशन डेवलपर्स को पता होना चाहिए कि अंतर्निहित फ़ाइल डिस्क्रिप्टर गैर-अवरुद्ध करने के लिए सेट हैं। इसलिए, देशी सिंक्रोनस ऑपरेशंस को EAGAIN या EWOULDBLOCK लिए वापसी मान और EAGAIN जांच करनी चाहिए।
  • Boost.Asio अपने नेटवर्किंग समर्थन में थोड़ा अधिक समृद्ध है। इसके अलावा libuv के नेटवर्किंग की कई सुविधाएं प्रदान करती हैं, Boost.Asio एसएसएल और आईसीएमपी सॉकेट का समर्थन करती है। इसके अलावा, Boost.Asio सिंक्रोनस अवरोधन और सिंक्रोनस गैर-अवरुद्ध संचालन प्रदान करता है, इसके एसिंक्रोनस ऑपरेशंस के अतिरिक्त। कई नि: शुल्क स्थायी कार्य हैं जो सामान्य उच्च स्तरीय संचालन प्रदान करते हैं, जैसे बाइट्स की एक सेट मात्रा पढ़ना, या जब तक निर्दिष्ट डिलीमीटर वर्ण पढ़ा नहीं जाता है।

संकेत

  • libuv अपने uv_signal_t प्रकार और uv_signal_* संचालन के साथ एक अमूर्त kill और सिग्नल हैंडलिंग प्रदान करता है। फिलहाल , केवल डिफ़ॉल्ट इवेंट लूप सिग्नल का समर्थन करता है।
  • Boost.Asio kill लिए एक अमूर्तता का समर्थन नहीं करता है, लेकिन इसकी signal_set_service सिग्नल हैंडलिंग प्रदान करता है।

भारतीय दंड संहिता

एपीआई मतभेद

जबकि एपीआई अकेले भाषा के आधार पर अलग हैं, यहां कुछ महत्वपूर्ण अंतर हैं:

ऑपरेशन और हैंडलर एसोसिएशन

Boost.Asio के भीतर, एक ऑपरेशन और हैंडलर के बीच एक-से-एक मैपिंग है। उदाहरण के लिए, प्रत्येक async_write ऑपरेशन एक बार WriteHandler का आह्वान करेगा। यह कई libuv संचालन और हैंडलर के लिए सच है। हालांकि, libuv's uv_async_send एक से एक मैपिंग का समर्थन करता है। एकाधिक uv_async_send कॉल के परिणामस्वरूप uv_async_cb को एक बार बुलाया जा सकता है।

कॉल चेन बनाम वॉचर लूप्स

कार्य से निपटने पर, जैसे स्ट्रीम / यूडीपी से पढ़ना, संकेतों को संभालना, या टाइमर पर इंतजार करना, बूस्ट.एसीओ की एसिंक्रोनस कॉल चेन थोड़ा अधिक स्पष्ट हैं। Libuv के साथ, एक विशेष घटना में हितों को नामित करने के लिए एक दर्शक बनाया जाता है। फिर लूप को वॉचर के लिए शुरू किया जाता है, जहां कॉलबैक प्रदान किया जाता है। रुचियों की घटना प्राप्त करने पर, कॉलबैक लागू किया जाएगा। दूसरी तरफ, 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 );   --'
}    

और यहां libuv के साथ एक ही उदाहरण है, जहां प्रत्येक बार वॉचर का मानना ​​है कि सॉकेट में डेटा है:

uv_read_start( socket, alloc_buffer, handle_read ); --.
                                                      |
    .-------------------------------------------------'
    |
    V
void handle_read( ... )
{
  fprintf( stdout, "got data\n" );
}

स्मृति आवंटन

Boost.Asio और libuv में watchers में एसिंक्रोनस कॉल चेन के परिणामस्वरूप, स्मृति आवंटन अक्सर अलग-अलग समय पर होता है। पर्यवेक्षकों के साथ, libuv आवंटन को तब तक रोकता है जब तक कि उसे ऐसी घटना प्राप्त न हो जिसके लिए स्मृति को संभालने की आवश्यकता होती है। आवंटन उपयोगकर्ता कॉलबैक के माध्यम से किया जाता है, libuv के लिए आंतरिक आह्वान किया जाता है, और आवेदन की deallocation जिम्मेदारी को रोकता है। दूसरी तरफ, Boost.Asio संचालन में से कई की आवश्यकता होती है कि एसिंक्रोनस ऑपरेशन जारी करने से पहले मेमोरी आवंटित की जाए, जैसे कि async_read के लिए buffer का मामला। Boost.Asio null_buffers प्रदान करता है, जिसका उपयोग किसी ईवेंट को सुनने के लिए किया जा सकता है, जिससे स्मृति स्मृति आवंटन को स्मृति आवंटित करने की अनुमति देता है।

यह स्मृति आवंटन अंतर भी bind->listen->accept भीतर प्रस्तुत करता bind->listen->accept लूप bind->listen->accept । Libuv के साथ, uv_listen एक इवेंट लूप बनाता है जो कनेक्शन को स्वीकार करने के लिए तैयार होने पर उपयोगकर्ता कॉलबैक का आह्वान करेगा। यह एप्लिकेशन को क्लाइंट के आवंटन को तब तक स्थगित करने की अनुमति देता है जब तक किसी कनेक्शन का प्रयास नहीं किया जाता है। दूसरी ओर, Boost.Asio की listen केवल acceptor की स्थिति बदलता है। async_accept कनेक्शन ईवेंट के लिए सुनता है, और सहकर्मी से पहले सहकर्मी आवंटित करने की आवश्यकता होती है।

प्रदर्शन

दुर्भाग्य से, मेरे पास libuv और Boost.Asio की तुलना करने के लिए कोई ठोस बेंचमार्क नंबर नहीं है। हालांकि, मैंने रीयल-टाइम और पास-रीयल-टाइम अनुप्रयोगों में पुस्तकालयों का उपयोग करके समान प्रदर्शन देखा है। यदि हार्ड नंबर वांछित हैं, तो libuv का बेंचमार्क परीक्षण प्रारंभिक बिंदु के रूप में कार्य कर सकता है।

इसके अतिरिक्त, जबकि वास्तविक बाधाओं की पहचान करने के लिए प्रोफाइलिंग की जानी चाहिए, स्मृति आवंटन से अवगत रहें। Libuv के लिए, स्मृति आवंटन रणनीति मुख्य रूप से आवंटक कॉलबैक तक ही सीमित है। दूसरी ओर, Boost.Asio का एपीआई आवंटन कॉलबैक की अनुमति नहीं देता है, और इसके बजाय एप्लिकेशन को आवंटन रणनीति को धक्का देता है। हालांकि, Boost.Asio में हैंडलर / कॉलबैक की प्रतिलिपि बनाई जा सकती है, आवंटित और हटाया जा सकता है। Boost.Asio अनुप्रयोगों के लिए हैंडलर के लिए स्मृति आवंटन रणनीति को लागू करने के लिए कस्टम मेमोरी आवंटन कार्यों को प्रदान करने की अनुमति देता है।

परिपक्वता

Boost.Asio

एशियाई का विकास कम से कम ओसीटी -2004 की तारीख है, और 20-दिन की सहकर्मी समीक्षा के बाद इसे 22-मार्च -2006 को बूस्ट 1.35 में स्वीकार किया गया था। यह TR2 के लिए नेटवर्किंग लाइब्रेरी प्रस्ताव के लिए संदर्भ कार्यान्वयन और एपीआई के रूप में भी कार्य करता है। Boost.Asio में उचित मात्रा में documentation , हालांकि इसकी उपयोगिता उपयोगकर्ता से उपयोगकर्ता में भिन्न होती है।

एपीआई में काफी लगातार अनुभव होता है। इसके अतिरिक्त, एसिंक्रोनस ऑपरेशंस ऑपरेशन के नाम में स्पष्ट हैं। उदाहरण के लिए, accept सिंक्रोनस अवरोधन है और async_accept asynchronous है। एपीआई आम I / O कार्य के लिए नि: शुल्क फ़ंक्शंस प्रदान करता है, उदाहरण के लिए, एक स्ट्रीम से पढ़ना जब तक \r\n पढ़ा जाता है। कुछ नेटवर्क विशिष्ट विवरणों को छिपाने के लिए भी ध्यान दिया गया है, जैसे ip::address_v4::any() 0.0.0.0 के "सभी इंटरफेस" पते का प्रतिनिधित्व करता है।

अंत में, 1.47+ बूस्ट हैंडलर ट्रैकिंग प्रदान करता है, जो डीबगिंग के साथ-साथ सी ++ 11 समर्थन के दौरान उपयोगी साबित हो सकता है।

libuv

उनके जीथब ग्राफ के आधार पर, नोड.जेएस का विकास कम से कम एफईबी FEB-2009 , और libuv की विकास की तारीख MAR-2011uvbook एक libuv परिचय के लिए एक महान जगह है। एपीआई एक विस्तृत शीर्षलेख के रूप में documented है, लेकिन अभी भी कुछ क्षेत्रों में योगदान का उपयोग कर सकता है।

कुल मिलाकर, एपीआई काफी सुसंगत और उपयोग करने में आसान है। भ्रम का स्रोत हो सकता है कि एक विसंगति यह है कि uv_tcp_listen एक वॉचर लूप बनाता है। यह अन्य वॉचर्स से अलग है जो आमतौर पर uv_*_start और uv_*_stop वॉचर लूप के जीवन को नियंत्रित करने के लिए कार्यों की जोड़ी uv_*_stop । इसके अलावा, uv_fs_* संचालन में से कुछ में तर्कसंगत तर्क हैं (7 तक)। कॉलबैक (अंतिम तर्क) की उपस्थिति पर सिंक्रोनस और असिंक्रोनस व्यवहार निर्धारित किए जाने के साथ, तुल्यकालिक व्यवहार की दृश्यता कम हो सकती है।

अंत में, libuv प्रतिबद्ध इतिहास में एक त्वरित नज़र से पता चलता है कि डेवलपर्स बहुत सक्रिय हैं।







libuv