2010-12-28 4 views
7

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

अब मुझे आश्चर्य है, क्या विभिन्न वेबसाइटों में तेजी से अलग संरचनाओं की जानकारी वाली वेबसाइट है, esp। जावा/सी #/पायथन/... (सी ++ भी है लेकिन ऐसे कई कंपाइलर्स हैं जो शायद बहुत अलग हैं)।

उदा। वहाँ

if (a()) b(); 

और

a() && b(); 

एक और उदाहरण बीच एक अंतर है: a = a * 4 शायद a <<= 2 रूप में एक ही कोड को संकलित किया गया है?

मैं इसे स्वयं परीक्षण कर सकता हूं, निश्चित रूप से, उन्हें 100000 बार चलाने और रनटाइम की तुलना करने के लिए लिखना, लेकिन मैं चीजों को लिखने के नए तरीकों के बारे में भी जानना चाहूंगा, शायद उन चीजें जिन्हें मैंने पहले नहीं माना था । आपके उत्तरों के लिए धन्यवाद!

+3

जब तक कि आप बहुत ही विशेष प्रकार के हार्डवेयर (जैसे छोटे एम्बेडेड जावा स्मार्टकार्ड) या बहुत विशेष एल्गोरिदम (जैसे, कहें, क्रिप्टोग्राफिक एपीआई) पर काम नहीं कर रहे हैं, इस बारे में चिंता करने में कोई बात नहीं है। – SyntaxT3rr0r

+5

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

+4

बूलियन बीजगणित और मूल निर्णय संरचनाओं की तुलना में एक भाषा के लिए बहुत कुछ है। .NET 4 के लिए ढांचा पर्याप्त डरावना है, 2-3 अन्य की तुलना में बहुत कम है। क्या आप सी ++ प्रबंधित या अप्रबंधित बात कर रहे हैं? लॉल, लोग इस सामान को मशीन नहीं लिखते हैं। आप सही दस्तावेज खोजने के लिए भाग्यशाली होंगे, बहुत कम क्रॉस फ्रेमवर्क बिग-ओ चार्ट। वास्तविकता में आपका स्वागत है मेरे दोस्त। –

उत्तर

9

if (a()) b(); और a() && b(); के बीच कोई अंतर है?

हां, पठनीयता। पहला इरादा के बारे में कहीं अधिक स्पष्ट है।

a = a * 4a <<= 2 के समान कोड के लिए संकलित किया गया है?

सबसे अधिक संभावना हां। लेकिन अगर वे अलग-अलग CPU निर्देशों के रूप में समाप्त हो जाते हैं, तो समय में अंतर बहुत छोटा होगा, और पहले और बाद में निर्देशों पर निर्भर करेगा।

आधुनिक CPU के लिए माइक्रो अनुकूलन

  • ज्यादातर व्यर्थ है
  • बहुत मुश्किल
  • अक्सर क्या एक 'अनुकूलन' 5 या 10 साल पहले हुआ करता था के विपरीत।

निष्कर्ष में, पढ़ने योग्य कोड पहले लिखें। जब आपके पास कोई प्रदर्शन समस्या है, प्रोफ़ाइल और पहले उपाय करें।

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

+0

@ बेन: आप सही हैं, मैंने अनदेखा किया है (: लेकिन यह वास्तव में प्रश्न या उत्तर के मूल को प्रभावित नहीं करता है। –

+0

अब कम से कम कुछ काल्पनिक भविष्य पाठक नहीं आएंगे और उन्होंने एक गलत अनुकूलन लागू किया होगा क्योंकि उन्होंने देखा आप इसके साथ सहमत हुए हैं। –

11

मैं कहूंगा कि ये माइक्रो-ऑप्टिमाइज़ेशन की तरह होने की संभावना है जो कोई फर्क नहीं पड़ेगा और प्रयास के लायक नहीं हैं।

एल्गोरिदम विकल्प महत्वपूर्ण है, लेकिन जिन पुस्तकों को आप पढ़ना चाहिए उन्हें this या this की तरह होना चाहिए।

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

आप अपने कोड को प्रोफाइल करने और यह पता लगाने के लिए बेहतर हैं कि आपके कोड का सबसे धीमा हिस्सा कहां रहता है और जहां सबसे अधिक काम किया जा रहा है। अनुकूलन करते समय अनुमान शायद ही काम करता है।

+0

द्वारा गुणा है I टी लगता है कि उसका मालिक इन अनुकूलन का जिक्र कर रहा था। – SLaks

+5

बॉस शायद किसी और चीज के बारे में सोच रहा हो, लेकिन उसने इस सुझाव के साथ एक बुरा बीज लगाया है। जवाब अभी भी "ऐसा मत करो।" – duffymo

+0

हाँ मेरे पास कॉर्मन की किताब है। मुझे यह भी पता है कि पठनीयता पहले जाती है। फिर भी ... इसे देखो, उदाहरण के लिए: http://graphics.stanford.edu/~seander/bithacks.html वहां बिल्कुल अद्भुत एल्गोरिदम हैं! प्रश्न मेरे सीखने और समझने के लिए और अधिक था ... –

8

ऐसे सूक्ष्मदर्शीकरण से परेशान न हों। वे आपको प्रदर्शन पहलू में कुछ भी नहीं देंगे।

यदि आपके पास प्रदर्शन समस्या है, तो बाधा पाएं और इसे अनुकूलित करें।

+0

(-1) के लिए कोई टिप्पणी? –

+0

पृथ्वी पर क्यों यह -1 प्राप्त करेगा? मैंने इसे वोट दिया। – duffymo

+0

बेवकूफ -1 के – JeremyP

4

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

आपके प्रश्न के लिए: यदि (ए()) बी(); और एक() & & बी(); पूरी तरह से वही हैं, यहां कोई अनुकूलन नहीं है। ए * ए और < < 2 समान नहीं हैं, उत्तरार्द्ध एक * 4 है।

+0

रेजेक्सन की प्रतिलिपि बनाने और रीजिक्स का उपयोग न करने की बजाय एक स्ट्रिंग बिल्डर/बफर का उपयोग करना चुनना, मिश्रित एल्गोरिदमिक जटिलता में अंतर है, माइक्रो-ऑप्टिमाइज़ेशन नहीं। –

+0

@ पेटी किर्कम वास्तव में, स्ट्रिंगबिल्डर का यह विकल्प प्रायः एक उदाहरण है कुछ वातावरण में माइक्रो-ऑप्टिमाइज़ेशन का। उदाहरण के लिए, आधुनिक जावा, एसबी में एक एसबी में बदल देगा अगर ऐसा लगता है कि यह महत्वपूर्ण है। मैं * केवल * स्ट्रिंगबिल्डर का उपयोग करता हूं जहां ऐसा होगा * वास्तव में कोड क्लीनर * या कहां * यह सिर्फ समझ में आता है * - उदाहरण के लिए एक टेम्पलेट जेनरेटर की तरह "फिट बैठता है" अन्यथा, मैंने कभी नहीं देखा * सामान्य स्ट्रिंग कॉन्सट के साथ एक समस्या enation "। –

+0

@pst मैंने 7 की कोशिश नहीं की है, लेकिन यह जावा 6 तक नहीं है कि संकलक कई कथनों में एक स्ट्रिंग को समेकित करने के लिए ऐसा करेगा, इंटरमीडिएट्स को संग्रहीत करेगा, जो अनुकूलन लागू होता है। एक कथन के लिए 'स्ट्रिंग जेड = ए + बी + सी', यह अक्सर होता है, लेकिन 'स्ट्रिंग जेड = ए + बी; अगर (x) z = z + c; 'नहीं होगा। –

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