2013-03-17 8 views
21

अनुरोध पुस्तकालय Pycurl प्रदर्शन के साथ तुलना कैसे करता है?पायथन अनुरोध बनाम पीईसीआरएल प्रदर्शन

मेरी समझ यह है कि अनुरोध urllib के लिए एक अजगर रैपर है जबकि PyCurl libcurl के लिए एक अजगर रैपर है जो देशी है, इसलिए PyCurl को बेहतर प्रदर्शन करना चाहिए, लेकिन यह सुनिश्चित नहीं करना चाहिए कि कितना।

मुझे कोई तुलनात्मक बेंचमार्क नहीं मिल रहा है।

उत्तर

52

I wrote you a full benchmark, एक छोटी सी बोतल आवेदन gUnicorn द्वारा समर्थित का उपयोग कर/meinheld + nginx, और देख कितनी देर तक यह 10,000 अनुरोध को पूरा करने के लेता है (प्रदर्शन और HTTPS के लिए)। अनलोड किए गए c4.Large उदाहरणों की एक जोड़ी पर एडब्ल्यूएस में टेस्ट चलाए जाते हैं, और सर्वर इंस्टेंस सीपीयू-सीमित नहीं था।

टीएल; डीआर सारांश: यदि आप बहुत सारी नेटवर्किंग कर रहे हैं, तो PyCurl का उपयोग करें, अन्यथा अनुरोधों का उपयोग करें। PyCurl अनुरोध के रूप में तेज़ी से 2x-3x छोटे अनुरोधों को पूरा करता है जब तक आप बड़े अनुरोधों (लगभग 520 एमबीआईटी या 65 एमबी/एस) के साथ बैंडविड्थ सीमा को हिट नहीं करते हैं, और 3x से 10x कम CPU पावर का उपयोग करते हैं। ये आंकड़े ऐसे मामलों की तुलना करते हैं जहां कनेक्शन पूलिंग व्यवहार समान होता है; डिफ़ॉल्ट रूप से, PyCurl कनेक्शन पूलिंग और DNS कैश का उपयोग करता है, जहां अनुरोध नहीं होते हैं, इसलिए एक निष्क्रिय कार्यान्वयन 10x धीमा होगा।

Combined-chart-RPS CPU Time by request size detailed

Just HTTP throughput Just HTTP RPS

ध्यान दें कि डबल लॉग भूखंडों परिमाण शामिल होने की वजह से ही नीचे ग्राफ के लिए उपयोग किया जाता है HTTP & HTTPS throughput HTTP & HTTPS RPS

  • pycurl जब एक कनेक्शन
  • अनुरोधों जब एक कनेक्शन
  • pycurl खुला एक करने के लिए लगभग 165 सीपीयू माइक्रोसेकंड लेता है पुन: उपयोग के बारे में 526 सीपीयू माइक्रोसेकंड लेता है एक अनुरोध जारी करने के लिए पुन: उपयोग के लिए एक अनुरोध जारी करने के लिए 73 के बारे में सीपीयू माइक्रोसेकंड लेता है नया कनेक्शन और एक अनुरोध (कोई संबंध पुन: उपयोग) जारी, या ~ 92 माइक्रोसेकंड
  • अनुरोधों को खोलने के लिए एक नया कनेक्शन खोलने के लिए और एक अनुरोध (कोई संबंध पुन: उपयोग) जारी, या के बारे में सीपीयू माइक्रोसेकंड लेता है ~ 552 माइक्रोसॉन्ड खोलने के लिए

Full results are in the link, बेंचमार्क पद्धति और सिस्टम कॉन्फ़िगरेशन के साथ।

चेतावनी: हालांकि मुझे यह सुनिश्चित करने के लिए दर्द होता है कि परिणाम वैज्ञानिक तरीके से एकत्र किए जाते हैं, यह केवल एक सिस्टम प्रकार और एक ऑपरेटिंग सिस्टम का परीक्षण करता है, और प्रदर्शन का सीमित सबसेट और विशेष रूप से HTTPS विकल्प।

+2

आपका बेंचमार्क अच्छा है, लेकिन लोकहोस्ट में कोई भी नेटवर्क परत ओवरहेड नहीं है। यदि आप यथार्थवादी प्रतिक्रिया आकार ('पोंग' यथार्थवादी नहीं है) का उपयोग करके वास्तविक नेटवर्क गति पर डेटा स्थानांतरण गति को कैप कर सकते हैं, और सामग्री-एन्कोडिंग मोड (संपीड़न के साथ और बिना) के मिश्रण सहित, और * फिर * समय के आधार पर उत्पादन कि, तो आपके पास वास्तविक अर्थ के साथ बेंचमार्क डेटा होगा। –

+0

मैं यह भी ध्यान देता हूं कि आपने लूप के बाहर pycurl के लिए सेटअप को स्थानांतरित किया है (यूआरएल सेट करना और writedata लक्ष्य तर्कसंगत रूप से लूप का हिस्सा होना चाहिए), और 'cStringIO' बफर को न पढ़ें; गैर-पिकुरल परीक्षणों को सभी को पाइथन स्ट्रिंग ऑब्जेक्ट के रूप में प्रतिक्रिया उत्पन्न करना होता है। –

+1

@MartijnPieters नेटवर्क ओवरहेड की कमी जानबूझकर है; यहां इरादा क्लाइंट का अलगाव में परीक्षण करना है। यूआरएल वहां प्लग करने योग्य है, इसलिए आप इसे अपनी पसंद के वास्तविक, लाइव सर्वर के खिलाफ परीक्षण कर सकते हैं (डिफ़ॉल्ट रूप से ऐसा नहीं होता है, क्योंकि मैं किसी के सिस्टम को हथियार नहीं देना चाहता)। ** मुख्य नोट: ** पिकुरल का बाद का परीक्षण body.getvalue के माध्यम से प्रतिक्रिया निकाय को पढ़ता है, और प्रदर्शन बहुत समान है। अगर आप सुधार का सुझाव दे सकते हैं तो पीआरएस कोड के लिए स्वागत है। – BobMcGee

12

सबसे पहले, requestsurllib3 library के शीर्ष पर बनाया गया है, stdlib urllib या urllib2 पुस्तकालयों सब पर नहीं किया जाता।

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

अंत में, requests के साथ काम करने के लिए एक बहुत अधिक अनुकूल API है, और आप पाएंगे कि आप उस मित्रवत API का उपयोग करके अधिक उत्पादक होंगे।

+0

मैं मानता हूं कि अधिकांश अनुप्रयोगों के लिए अनुरोधों की स्वच्छ API सबसे महत्वपूर्ण है; लेकिन नेटवर्क-गहन अनुप्रयोगों के लिए, pycurl का उपयोग करने के लिए कोई बहाना नहीं * नहीं है। ओवरहेड महत्वपूर्ण हो सकता है (विशेष रूप से डेटा सेंटर के भीतर)। – BobMcGee

+0

@BobMcGee: यदि नेटवर्क की गति इतनी अधिक है कि ओवरहेड कोई फर्क नहीं पड़ता है, तो आपको अब पूरे एप्लिकेशन के लिए पायथन का उपयोग नहीं करना चाहिए। –

+0

@Martijn_Pieters असहमत - पायथन प्रदर्शन इतना बुरा नहीं है, और सामान्य रूप से देशी पुस्तकालयों (जो कि pycurl का एक आदर्श उदाहरण है) के प्रदर्शन-संवेदनशील बिट्स को प्रतिनिधि करना बहुत आसान है। DropBox इसे काम कर सकता है, और यम आंतरिक रूप से pycurl का उपयोग करता है (क्योंकि इसके बहुत सारे काम बस नेटवर्क fetches है, जो जितनी जल्दी हो सके होने की आवश्यकता है)। – BobMcGee

0

आकार पर ध्यान केंद्रित - रैम 8GB और एक 512GB SSD के साथ अपने मैक बुक एयर पर

  1. , एक 100 एमबी फ़ाइल एक दूसरे 3 किलोबाइट पर आ के लिए (इंटरनेट और वाईफाई से), pycurl, कर्ल और अनुरोध लाइब्रेरी के फ़ंक्शन (चंकिंग या स्ट्रीमिंग के बावजूद) काफी समान हैं।

  2. 4 जीबी रैम के साथ छोटे Quad core Intel Linux box पर, स्थानीय स्तर पर (उसी बॉक्स पर अपाचे से) पर, 1 जीबी फ़ाइल के लिए, कर्ल और पायकुरल 'अनुरोध' लाइब्रेरी से 2.5x तेज हैं। और अनुरोधों के लिए एक साथ छेड़छाड़ और स्ट्रीमिंग के लिए 10% बूस्ट (50,000 से ऊपर खंड आकार) दें।

मैंने सोचा कि मैं pycurl के लिए अनुरोध बाहर स्वैप करने के लिए जा रहा था, लेकिन नहीं तो आवेदन मैं बना रहा हूं क्लाइंट और सर्वर को बंद करने के लिए नहीं जा रहा है के रूप में।

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