मेरे पास दो संबंधित प्रश्न हैं जो एक सामान्य है और जिस परियोजना पर मैं काम कर रहा हूं उसके लिए एक विशिष्ट है।लूप, फ़ंक्शन डिज़ाइन और दक्षता: दो प्रश्न
- आम तौर पर अगर मैं कोड के कुछ भागों कतिपय शर्तों के अधीन निष्पादित किया जा रहा साथ पुनरावृत्तियों (लाखों) का एक बहुत के साथ एक पाश है, यह बेहतर है (और अधिक कुशल) एकाधिक सशर्त बयान या एक से अधिक छोरों के बिना के साथ एक पाश के लिए है उन्हें। उदाहरण के लिए।
उदाहरण 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 की तरह लगता है अतिरेक की कीमत पर और अधिक कुशल कोड में परिणाम क्योंकि स्थिति केवल एक बार के बजाय जाँच कर रहे हैं होगा लाखों बार यदि सामान्य कोड बड़ा है या कई संभावित स्थितियां हैं तो यह बेहद अनावश्यक लगता है।
अब मेरी विशिष्ट समस्या के लिए। मेरे पास एक ऐसा फ़ंक्शन है जो फ़ाइल से अंक पढ़ता है और उन्हें डेटा संरचना में डाल देता है। यह इस तरह दिखता है:
जबकि (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 // ...
}
मुझे संदेह है कि पहले किसी भी आधुनिक कंपाइलर में कोई प्रभाव पड़ेगा। मैं और अधिक पठनीय के साथ जाऊंगा और संकलक को मेरे लिए अनुकूलित करने दें। – amit