समय से पहले की चर्चा को जड़ से ख़त्म कर देना
उस ने कहा, यहाँ कुछ आदतें हैं जिनसे मैं अनावश्यक दक्षता से बच गया हूँ, और कुछ मामलों में, मेरे कोड को सरल और अधिक सही भी बनाता हूँ।
यह सामान्य सिद्धांतों की चर्चा नहीं है, लेकिन कोड में अनावश्यक अक्षमताओं को पेश करने से बचने के लिए कुछ बातों की जानकारी होना है।
यह शायद ऊपर लंबी चर्चा में विलय किया जाना चाहिए। यह बहुत सामान्य ज्ञान है कि एक लूप के अंदर एक लूप, जहां आंतरिक लूप एक गणना को दोहराता है, धीमा होने वाला है। उदाहरण के लिए:
for (i = 0; i < strlen(str); i++) {
...
}
यह एक भयावह मात्रा में समय लेगा यदि स्ट्रिंग वास्तव में लंबा है, क्योंकि लूप के प्रत्येक पुनरावृत्ति पर लंबाई पुनर्गणना की जा रही है। ध्यान दें कि जीसीसी वास्तव में इस मामले का अनुकूलन करता है क्योंकि strlen()एक शुद्ध फ़ंक्शन के रूप में चिह्नित किया गया है।
जब एक मिलियन 32-बिट पूर्णांक को छाँटते हैं, तो बबल सॉर्ट जाने का गलत तरीका होगा । सामान्य तौर पर, सॉर्टिंग ओ (n * लॉग एन) समय (या बेहतर, मूलांक के अनुसार) के मामले में की जा सकती है, इसलिए जब तक आप नहीं जानते कि आपका डेटा छोटा होने जा रहा है, एक एल्गोरिथ्म देखें जो कम से कम O (n) है * लॉग एन)।
इसी तरह, डेटाबेस से निपटते समय, अनुक्रमणिकाओं के बारे में जागरूक रहें। यदि आप SELECT * FROM people WHERE age = 20, और आप लोगों (उम्र) पर कोई इंडेक्स नहीं रखते हैं, तो इसे बहुत तेज़ ओ (लॉग एन) इंडेक्स स्कैन के बजाय ओ (एन) अनुक्रमिक स्कैन की आवश्यकता होगी।
पूर्णांक अंकगणितीय पदानुक्रम
सी में प्रोग्रामिंग करते समय, ध्यान रखें कि कुछ अंकगणित संचालन दूसरों की तुलना में अधिक महंगे हैं। पूर्णांकों के लिए, पदानुक्रम कुछ इस तरह से होता है (कम से कम पहले महंगा):
यदि आप किसी मुख्यधारा के कंप्यूटर को लक्षित कर रहे हैं , तो कंपाइलर आमतौर पर चीजों n / 2को n >> 1अपने आप अनुकूलित कर लेगा , लेकिन यदि आप एक एम्बेडेड डिवाइस को लक्षित कर रहे हैं, तो आपको वह लक्जरी नहीं मिल सकती है।
इसके अलावा, % 2और & 1अलग शब्दार्थ है। विभाजन और मापांक आमतौर पर शून्य की ओर गोल होते हैं, लेकिन यह कार्यान्वयन को परिभाषित करता है। अच्छा राजभाषा ' >>और &हमेशा नकारात्मक अनंत की ओर गोल होता है, जो (मेरी राय में) बहुत अधिक समझ में आता है। उदाहरण के लिए, मेरे कंप्यूटर पर:
printf("%d\n", -1 % 2); // -1 (maybe)
printf("%d\n", -1 & 1); // 1
इसलिए, जो समझ में आता है उसका उपयोग करें। यह मत सोचिए कि % 2जब आप मूल रूप से लिखने जा रहे थे तब आप एक अच्छा लड़का हो & 1।
महंगे फ्लोटिंग पॉइंट ऑपरेशन
भारी फ़्लोटिंग पॉइंट ऑपरेशन्स जैसे कि pow()और log()कोड से बचें जो वास्तव में उनकी आवश्यकता नहीं है, खासकर जब पूर्णांकों के साथ काम करना। उदाहरण के लिए, एक संख्या पढ़ना:
int parseInt(const char *str)
{
const char *p;
int digits;
int number;
int position;
// Count the number of digits
for (p = str; isdigit(*p); p++)
{}
digits = p - str;
// Sum the digits, multiplying them by their respective power of 10.
number = 0;
position = digits - 1;
for (p = str; isdigit(*p); p++, position--)
number += (*p - '0') * pow(10, position);
return number;
}
न केवल यह pow()(और int<-> doubleइसका उपयोग करने के लिए आवश्यक रूपांतरणों) का उपयोग महंगा है, बल्कि यह सटीक नुकसान के लिए एक अवसर बनाता है (संयोग से, ऊपर दिए गए कोड में सटीक मुद्दे नहीं हैं)। इसीलिए जब मैं इस प्रकार के फंक्शन को गैर-गणितीय संदर्भ में इस्तेमाल करता हूं तो मैं विंस हो जाता हूं।
इसके अलावा, ध्यान दें कि नीचे "चतुर" एल्गोरिदम, जो प्रत्येक पुनरावृत्ति पर 10 से गुणा करता है, वास्तव में कोड की तुलना में अधिक संक्षिप्त है:
int parseInt(const char *str)
{
const char *p;
int number;
number = 0;
for (p = str; isdigit(*p); p++) {
number *= 10;
number += *p - '0';
}
return number;
}