2012-06-13 17 views
5

मेरे पास दो संबंधित प्रश्न हैं जो एक सामान्य है और जिस परियोजना पर मैं काम कर रहा हूं उसके लिए एक विशिष्ट है।लूप, फ़ंक्शन डिज़ाइन और दक्षता: दो प्रश्न

  1. आम तौर पर अगर मैं कोड के कुछ भागों कतिपय शर्तों के अधीन निष्पादित किया जा रहा साथ पुनरावृत्तियों (लाखों) का एक बहुत के साथ एक पाश है, यह बेहतर है (और अधिक कुशल) एकाधिक सशर्त बयान या एक से अधिक छोरों के बिना के साथ एक पाश के लिए है उन्हें। उदाहरण के लिए।

उदाहरण 1:

while (something()) 
{ 
    // some common code 
    if (condition_a) 
     // some code 
    if (condition_b) 
     // some code 
    // some more common code 
} 

उदाहरण 2:

if (condition_a && condition_b) 
{ 
    while (something()) 
    { 
     // some common and specific code 
    } 
} 
else if (condition_a) 
    while (something()) //.. 
else if (condition_b) 
    // Another loop 
else //... 

यह उदाहरण 2 की तरह लगता है अतिरेक की कीमत पर और अधिक कुशल कोड में परिणाम क्योंकि स्थिति केवल एक बार के बजाय जाँच कर रहे हैं होगा लाखों बार यदि सामान्य कोड बड़ा है या कई संभावित स्थितियां हैं तो यह बेहद अनावश्यक लगता है।

  1. अब मेरी विशिष्ट समस्या के लिए। मेरे पास एक ऐसा फ़ंक्शन है जो फ़ाइल से अंक पढ़ता है और उन्हें डेटा संरचना में डाल देता है। यह इस तरह दिखता है:

    जबकि (reader-> read_point) { // कुछ सामान // सम्मिलन बिंदु को करना }

समस्या वहाँ एक को पढ़ने के लिए कई कार्य कर रहे हैं वह यह है कि बिंदु जो उपयोगकर्ता द्वारा प्रदान किए गए मानदंडों के आधार पर उपयोग किया जाना चाहिए। उदाहरण के लिए read_point_inside_circle(), read_point_inside_rectangle() आदि

आदर्श रूप से मैं पहले फ़ंक्शन पर निर्णय लेने के लिए फ़ंक्शन पॉइंटर का उपयोग करना चाहता हूं, हालांकि मुझे नहीं लगता कि यह संभव है क्योंकि पाठक रीडर क्लास का उदाहरण है (यदि यह संभव है तो किसी भी तरह से मेरी सभी समस्याओं का समाधान होगा)।

इस स्थिति में यह बेहतर है यदि मेरे पास एकाधिक लूप हैं जो केवल स्थिति से भिन्न हैं या यदि मैं अनावश्यक कोड से बचने के लिए कथनों का उपयोग करता हूं, उदाहरण के लिए।

for(;;) 
{ 
    if (read_every_point) 
     if(!reader->read_point()) 
      break; 
    else if (read_inside_circle) 
     if(!reader->read_inside_circle()) 
      break; 
    else if // ... 
} 
+2

मुझे संदेह है कि पहले किसी भी आधुनिक कंपाइलर में कोई प्रभाव पड़ेगा। मैं और अधिक पठनीय के साथ जाऊंगा और संकलक को मेरे लिए अनुकूलित करने दें। – amit

उत्तर

2

आदर्श रूप में मैं, सही समारोह पहले से तय एक समारोह सूचक का उपयोग करना चाहेंगे लेकिन मुझे नहीं लगता कि यह संभव है के बाद से पाठक एक रीडर वर्ग का एक उदाहरण है (अगर यह किसी भी तरह संभव है कि मेरी सभी समस्याओं का समाधान होगा)।

आप सदस्य समारोह संकेत का उपयोग कर सकते है कि के लिए, यह मानते हुए सभी अपने पढ़ कार्यों में एक ही हस्ताक्षर है:

typedef void (Reader::*read_fun_t)(); 
read_fun_t read_fun = &Reader::read_point; 
// or 
read_fun_t read_fun = &Reader::read_inside_circle; 

... 

(reader->*read_fun)(); 

या यदि आप उन लोगों के साथ आरामदायक महसूस नहीं करते, बस बनाने के अपने विधि मुक्त कॉल करने वाले स्वयं के फ़ंक्शंस:

void read_point(Reader* reader){ reader->read_point(); } 
void read_inside_circle(Reader* reader){ reader->read_inside_circle(); } 

और इसके बजाय नियमित फ़ंक्शन पॉइंटर्स का उपयोग करें।

+0

यह वास्तव में काम करता है, लेकिन दुख की बात है कि मेरे कार्य अलग-अलग पैरामीटर लेते हैं: read_point(), inside_circle (F64 center_x, F64 center_y, F64 त्रिज्या), अंदर_rectangle (F64 min_x, F64 max_x, ...)। इस के आसपास कोई रास्ता? – jaho

+0

@Marian: यदि पैरामीटर _loop invariant_ हैं, तो उच्च स्तरीय फ़ंक्शन ऑब्जेक्ट्स और बाइंडर्स करेंगे। 'Std | boost :: function' और' std | boost :: bind' की तलाश करें। –

3

अपने विशिष्ट प्रश्न का उत्तर देने के लिए: फ़ाइल को पढ़ने में लगने वाला समय if/else के समय में बिताए गए समय को खत्म कर देगा। जो भी अधिक पठनीय लिखो लिखें। यह आमतौर पर अधिक कुशल होता है और इसे तब तक अनुकूलित नहीं करता जब तक आप साबित न करें कि यह एक बाधा है।

अपने सामान्य प्रश्न का उत्तर देने के लिए: कई चीजों पर निर्भर करता है और आधुनिक कंप्यूटर्स आपके अंतर्ज्ञान से कुशलतापूर्वक स्वतंत्र काम करने में बहुत अच्छे हैं। तो यह एक सैद्धांतिक चर्चा है जब तक कि आपके पास एक विशिष्ट संकलक और वास्तुकला पर कोड नहीं है।

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