पुस्तकालयों का उपयोग करते समय दक्षता प्रदान करना कठिन क्यों है?


10

किसी भी छोटे डेटाबेस प्रसंस्करण को पायथन / पर्ल / ... लिपियों द्वारा आसानी से निपटा जा सकता है, जो भाषा से ही पुस्तकालयों और / या उपयोगिताओं का उपयोग करता है। हालाँकि, जब प्रदर्शन की बात आती है, तो लोग C / C ++ / निम्न-स्तरीय भाषाओं के लिए पहुँचते हैं। कोड को जरूरतों के अनुरूप बनाने की संभावना प्रतीत होती है कि ये भाषाएं बिगडाटा के लिए कितनी आकर्षक हैं - क्या यह स्मृति प्रबंधन, समानता, डिस्क एक्सेस या यहां तक ​​कि निम्न-स्तरीय अनुकूलन (सी / सी ++ स्तर पर विधानसभा निर्माण के माध्यम से) से संबंधित है।

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

उदाहरण के लिए, एक आक्षेप पर विचार करें जो लगातार वेबपेजों को क्रॉल करता है और एकत्र किए गए डेटा को पार्स करता है। प्रत्येक स्लाइडिंग-विंडो के लिए, निकाले गए डेटा पर अलग-अलग डेटा माइनिंग एल्गोरिदम चलाए जाते हैं। क्यों उपलब्ध पुस्तकालयों / चौखटों का उपयोग करके डेवलपर्स इसे बंद कर देंगे (यह क्रॉलिंग, टेक्स्ट प्रोसेसिंग और डेटा माइनिंग के लिए हो सकता है)? पहले से लागू सामान का उपयोग करने से न केवल पूरी प्रक्रिया को कोड करने का बोझ कम हो जाएगा, बल्कि बहुत समय भी बचेगा।

एक ही शॉट में :

  • क्या प्रदर्शन की गारंटी के द्वारा कोड लिखने से क्या होता है ?
  • जब आपको उच्च प्रदर्शन का आश्वासन देना हो तो चौखटे / पुस्तकालयों पर निर्भर रहना क्यों जोखिम भरा है ?

1
क्या आप सटीक प्रश्न को स्पष्ट कर सकते हैं? हो सकता है कि आपके मन में आने वाले कुछ संभावित उत्तर भी मदद कर सकें।
अमीर अली अकबरी

@AmirAliAkbari सीनऑन ने एक उत्तर पोस्ट किया और मैंने अपने प्रश्न में विशिष्टता की कमी को देखा। मैंने उनकी पोस्ट पर एक टिप्पणी जोड़ी है। कृपया, पोस्ट पर किसी भी सुधार का सुझाव देने के लिए स्वतंत्र महसूस करें - मैं इसे हटाने की योजना बना रहा हूं, अन्यथा।
रुबेन्स

जवाबों:


4

खुद पर और फिर से (और अभी भी कर रहे हैं) पुनर्लेखन का खेल करने के बाद, मेरी तत्काल प्रतिक्रिया अनुकूलनशीलता थी

जबकि मानक कार्यों के लिए चौखटों और पुस्तकालयों में (संभवत: अंतःसंबंधी) दिनचर्या का एक विशाल शस्त्रागार है, उनका ढांचा अक्सर (हमेशा?) शॉर्टकट को नापसंद करता है। वास्तव में, अधिकांश रूपरेखाओं में कुछ प्रकार के कोर बुनियादी ढांचे होते हैं, जिनके चारों ओर बुनियादी कार्यक्षमता की एक मुख्य परत लागू होती है। अधिक विशिष्ट कार्यक्षमता मूल परत का उपयोग करती है और कोर के चारों ओर एक दूसरी परत में रखी जाती है।

अब शॉर्टकट से मेरा मतलब है कि कोर का उपयोग किए बिना एक दूसरी लेयर रूटीन से दूसरी लेयर रूटीन पर सीधे जाना। विशिष्ट उदाहरण (मेरे डोमेन से) टाइमस्टैम्प होगा: आपके पास किसी प्रकार का टाइमस्टैम्प डेटा स्रोत है। इस प्रकार अब तक काम केवल वायर से डेटा को पढ़ने और इसे कोर में पास करने का है ताकि आपका दूसरा कोड उस पर दावत दे सके।

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

यह वह जगह है जहां आपके हाथ से तैयार किए गए ढांचे चमकेंगे, यह सिर्फ एक मामूली बदलाव है और आप वास्तविक दुनिया की मॉडलिंग कर रहे हैं जबकि अन्य सभी (गैर-उद्योग-विशिष्ट) रूपरेखाओं में अब एक प्रदर्शन नुकसान होगा।

समय के साथ, वास्तविक दुनिया और मॉडल के बीच विसंगति बढ़ जाएगी। एक ऑफ-द-शेल्फ ढांचे के साथ आप जल्द ही जैसे प्रश्नों का सामना करना पड़ होगी: मैं कैसे प्रतिनिधित्व कर सकते हैं thisमें thatया कैसे कर सकता हूँ दिनचर्या करते Xस्वीकार / उत्पादन Y

अब तक यह C / C ++ के बारे में नहीं था। लेकिन अगर, किसी कारण से, आप फ्रेमवर्क को नहीं बदल सकते हैं, यानी आपको एक छोर से दूसरे छोर तक जाने के लिए डेटा के दोहरे रूपांतरण के साथ काम करना होगा, तो आप आमतौर पर अतिरिक्त ओवरहेड को कम करने वाले कुछ काम करेंगे। मेरे मामले में, एक टीएआई-> यूटीसी या यूटीसी-> टीएआई कनवर्टर कच्चे सी (या एक एफपीजीए) के लिए सबसे अच्छा बचा है। कोई लालित्य संभव नहीं है, कोई गहरा स्मार्ट डेटा संरचना नहीं है जो समस्या को मामूली बनाती है। यह सिर्फ एक उबाऊ स्विच बयान है, और क्यों नहीं एक ऐसी भाषा का उपयोग करें जिसका संकलक बिल्कुल वैसा ही अनुकूलन करने में अच्छा है?


1
+1 यह कि मेरी पोस्ट में बहुत स्पष्ट नहीं होने के लिए मेरी गलती हो सकती है, इसलिए दूसरों को यह पहले नहीं मिला था। यह निश्चित रूप से उस तरह का जवाब है जिसकी मुझे तलाश थी। धन्यवाद।
रूबेंस

7

मुझे नहीं लगता कि हर कोई C / C ++ के लिए पहुंचता है जब प्रदर्शन एक मुद्दा है।

निम्न-स्तरीय कोड लिखने का लाभ कम सीपीयू चक्र, या कभी-कभी, कम मेमोरी का उपयोग होता है। लेकिन मैं ध्यान दूंगा कि उच्च-स्तरीय भाषाएं निम्न-स्तर की भाषाओं को कॉल कर सकती हैं, और इस मूल्य के कुछ पाने के लिए, कर सकती हैं। पायथन और जेवीएम भाषाएं ऐसा कर सकती हैं।

उदाहरण के लिए, उसके डेस्कटॉप पर स्किकिट-लर्न का उपयोग करने वाले डेटा वैज्ञानिक पहले से ही भारी संख्या में क्रंचिंग करने के लिए अनुकूलित देशी दिनचर्या को बुला रहे हैं। गति के लिए नया कोड लिखने का कोई मतलब नहीं है।

वितरित "बड़े डेटा" संदर्भ में, आप डेटा आंदोलन पर आमतौर पर अड़चन हैं: नेटवर्क स्थानांतरण और I / O। मूल कोड मदद नहीं करता है। क्या मदद करता है तेजी से चलाने के लिए एक ही कोड नहीं लिख रहा है, लेकिन होशियार कोड लिख रहा है।

उच्च-स्तरीय भाषाएं आपको C / C ++ की तुलना में डेवलपर समय की एक निश्चित मात्रा में अधिक परिष्कृत वितरित एल्गोरिदम को लागू करने जा रही हैं। पैमाने पर, बेहतर डेटा आंदोलन के साथ स्मार्ट एल्गोरिथ्म गूंगा देशी कोड को हरा देगा।

यह भी आमतौर पर सही है कि डेवलपर का समय, और बग, लागत नए हार्डवेयर से अधिक है। एक वरिष्ठ डेवलपर के समय का एक वर्ष $ 200K पूरी तरह से लोड हो सकता है; एक वर्ष से अधिक की गणना के लायक समय के सैकड़ों सर्वर किराए पर। यह ज्यादातर मामलों में समझ में नहीं आता है कि अधिक हार्डवेयर फेंकने पर अनुकूलन को परेशान करने के लिए।

मुझे "अनुदान" और "अक्षम" और "जोर" के बारे में समझ नहीं आ रही है?


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

1
नहीं, यह एक अच्छा सवाल है, आप अपनी टिप्पणी यहाँ संपादित कर सकते हैं यदि आप चाहें तो प्रश्न के संपादन में।
सीन ओवेन

कृपया, जांच लें कि क्या प्रश्न अब समझ में आता है। मैंने इसे और अधिक सरल बनाने के लिए एक छोटा सा मामला जोड़ा है। यदि आप प्रश्न में कुछ विचार जोड़ना चाहते हैं, तो कृपया इसे संपादित करने के लिए स्वतंत्र महसूस करें।
रूबेन्स

4

जैसा कि हम सभी जानते हैं कि डिजिटल दुनिया में एक ही काम करने / अपेक्षित परिणाम प्राप्त करने के कई तरीके हैं।

और कोड से आने वाली जिम्मेदारियां / जोखिम डेवलपर्स के कंधों पर हैं।

यह छोटा है लेकिन मुझे लगता है कि .NET दुनिया से एक बहुत ही उपयोगी उदाहरण है ..

बहुत से .NET डेवलपर बिल्ट-इन बाइनरीराइडर का उपयोग करते हैं - प्रदर्शन के लिए अपने डेटा क्रमांकन पर बाइनरीवर्टर / प्रक्रिया पर नियंत्रण प्राप्त करें।

यह फ्रेमवर्क का CSharp स्रोत कोड है जो बाइनरीवर्टर क्लास में निर्मित 'ओवरलोडेड राइट्स में से एक है:

// Writes a boolean to this stream. A single byte is written to the stream
// with the value 0 representing false or the value 1 representing true.
// 
public virtual void Write(bool value) 
{
     //_buffer is a byte array which declared in ctor / init codes of the class
    _buffer = ((byte) (value? 1:0));

    //OutStream is the stream instance which BinaryWriter Writes the value(s) into it.
    OutStream.WriteByte(_buffer[0]);
}

जैसा कि आप देख रहे हैं, यह विधि _buffer वैरिएबल को अतिरिक्त असाइन किए बिना लिखी जा सकती है:

public virtual void Write(bool value) 
{
    OutStream.WriteByte((byte) (value ? 1 : 0));
}

असाइन किए बिना हम कुछ मिलीसेकंड प्राप्त कर सकते हैं..इससे कुछ मिलीसेकंड "लगभग कुछ भी नहीं" के रूप में स्वीकार कर सकते हैं लेकिन क्या होगा अगर मल्टी-हजारों लेखन (एक सर्वर प्रक्रिया में)?

मान लीजिए कि "कुछ" 2 है (मिलीसेकंड) और बहु-हजारों उदाहरण केवल 2.000 हैं। इसका मतलब 4 सेकंड अधिक प्रक्रिया समय है। 4 सेकंड बाद में वापस आना ।।

यदि हम .NET से विषय जारी रखते हैं और यदि आप BCL - .NET बेस क्लास लाइब्रेरी के सोर्स कोड्स की जांच कर सकते हैं- तो MSDN से आप डेवलपर के निर्णय से बहुत सारे प्रदर्शन खो सकते हैं।

BCL स्रोत से कोई भी बिंदु यह सामान्य है कि आप डेवलपर को अपने कोड में लूप के लिए () या फ़ॉरच () लूप का उपयोग करने का फैसला कर सकते हैं जो कि () लूप के लिए तेज़ी से लागू हो सकता है।

यह छोटे लाभ हमें कुल प्रदर्शन देते हैं ।।

और अगर हम बाइनरीविटर पर लौटें।

वास्तव में _buffer कार्यान्वयन के लिए अतिरिक्त असाइनमेंट डेवलपर की गलती नहीं है..यह बिल्कुल "सुरक्षित रहने के लिए" तय है!

मान लीजिए कि हमने _buffer का उपयोग नहीं करने का फैसला किया है और दूसरी विधि को लागू करने का फैसला किया है..यदि हम दूसरी विधि के साथ एक तार पर बहु-हजारों बाइट्स भेजने की कोशिश करते हैं (यानी एक BLOB या CLOB डेटा डाउनलोड / अपलोड करें) यह आमतौर पर विफल हो सकता है क्योंकि कनेक्शन का गुम हो जाना..क्योंकि हम बिना किसी जाँच और नियंत्रण तंत्र के सभी डेटा भेजने की कोशिश करते हैं। जब कनेक्शन खो जाता है, तो सर्वर और क्लाइंट दोनों को भेजे गए डेटा को कभी पता नहीं चलता है या नहीं।

यदि डेवलपर "सुरक्षित रहने" का फैसला करता है, तो सामान्य रूप से इसका मतलब है कि प्रदर्शन लागत "सुरक्षित" तंत्र में लागू होना निर्भर करता है।

लेकिन अगर डेवलपर "जोखिम भरा हो, तो प्रदर्शन हासिल करें" का फैसला करता है, तो यह भी गलती नहीं है..तो क्या "जोखिम भरा" कोडिंग के बारे में कुछ चर्चाएं हैं।

और एक छोटे नोट के रूप में: वाणिज्यिक पुस्तकालय डेवलपर्स हमेशा सुरक्षित रहने की कोशिश करते हैं क्योंकि वे नहीं जान सकते कि उनका कोड कहां उपयोग करेगा।


4

प्रोग्रामर के नजरिए से आने पर, फ्रेमवर्क शायद ही कभी प्रदर्शन को सर्वोच्च प्राथमिकता देते हैं। यदि आपका पुस्तकालय व्यापक रूप से उन चीजों का लाभ उठाने वाला है, जिनके उपयोग की संभावना लोगों को सबसे अधिक होती है तो उपयोग, लचीलापन और विश्वसनीयता में आसानी होती है।

प्रदर्शन आमतौर पर माध्यमिक प्रतिस्पर्धी पुस्तकालयों में मूल्यवान है। "एक्स लाइब्रेरी बेहतर है क्योंकि यह तेज़ है।" फिर भी बहुत बार उन पुस्तकालयों में से एक के लिए सबसे इष्टतम समाधान का व्यापार होगा जो व्यापक रूप से लीवरेज हो सकता है।

किसी भी ढांचे का उपयोग करके आप स्वाभाविक रूप से एक जोखिम ले रहे हैं कि एक तेज समाधान मौजूद है। मैं शायद इतना कहूँ कि एक तेज़ समाधान लगभग हमेशा मौजूद है।

अपने आप को कुछ लिखना प्रदर्शन की गारंटी नहीं है, लेकिन अगर आप जानते हैं कि आप क्या कर रहे हैं और आवश्यकताओं का काफी सीमित सेट है तो यह मदद कर सकता है।

एक उदाहरण JSON पार्सिंग हो सकता है। वहाँ विभिन्न भाषाओं के लिए एक सौ पुस्तकालय हैं जो JSON को एक संदर्भ योग्य वस्तु में बदल देंगे और इसके विपरीत होंगे। मुझे एक कार्यान्वयन के बारे में पता है जो यह सब सीपीयू रजिस्टर में करता है। यह अन्य सभी पार्सरों की तुलना में औसत रूप से तेज है, लेकिन यह भी बहुत सीमित है और यह कि सीपीयू आपके साथ काम कर रहे हैं के आधार पर यह सीमा अलग-अलग होगी।

क्या उच्च प्रदर्शन वाले पर्यावरण विशिष्ट JSON पार्सर के निर्माण का कार्य एक अच्छा विचार है? मैं 100 में से 99 बार एक सम्मानित पुस्तकालय का लाभ उठाऊंगा। एक अलग उदाहरण में एक लाख पुनरावृत्तियों द्वारा गुणा किए गए कुछ अतिरिक्त सीपीयू चक्र विकास के समय को इसके लायक बना देंगे।

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