Sunday 15 April 2012

c - Optimizing the nested for loop -


  के लिए (n = 0; n & lt; L_SUBFR; n ++) {s = 0; के लिए (i = 0; i & lt; = n; i ++) {s + = exc [i] * h1 [n - i]; } Y1 [n] = s; }   

अनुकूलित संस्करण:

  के लिए (n = L_SUBFR; n! = 0; n--) {for (i = n; i! = 0; i--) {y1 [n] = y1 [n] + exc [i] * h1 [n - i]; }}   

मैंने दोनों कोड को AMD Opteron 6274 बिट मशीन पर gcc 4.4.6 के साथ संकलन के बाद चलाया है। हालांकि, I गति या निष्पादन समय में कोई भी लाभ देखने में सक्षम नहीं है I

(1) क्या कोई ऐसा तरीका है जो मैं उपर्युक्त कोड को और अधिक अनुकूलित कर सकता हूं?

(2) क्या कोई मुझे बता सकता है कि मैं लाभ क्यों नहीं देख पा रहा हूं?

आपको "तेज" कोड के बजाय पठनीय कोड बनाने पर ध्यान देना चाहिए। स्पीड अपने एल्गोरिदम को और अधिक कुशल बनाकर प्राप्त की गई है:

आप को त्वरित रूप से सरल तरीके से बदलकर अधिक प्रदर्शन प्राप्त कर सकते हैं, (i! = 0) कोड> (i)

कंपाइलर आपके लिए वैसे भी सभी करता है।


मैं अपडेट किए गए प्रश्नों के उद्धरण को पुनः लिखता हूँ

(1) क्या कोई तरीका है जो मैं उपर्युक्त कोड को और अधिक अनुकूलित कर सकता हूं?

ज़रूर, आप को बदल सकते हैं (i! = 0 ) और (n! = 0) के साथ (i) और (n) और सभी प्रकार के shenanigans और nitpicking के साथ यह कोड थोड़ा तेज करने के लिए, लेकिन अंत में, आप वास्तव में कुछ भी नहीं बदलेगा क्योंकि आपका कंपाइलर अधिक अनुकूलन करता है अक्सर, यह सीधे जनरेट किया गया विधानसभा को अनुकूलित कर सकता है।

(2) क्या कोई मुझे बता सकता है कि मैं लाभ क्यों नहीं देख पा रहा हूं?

संकलक मेरे दोस्त यहां तक ​​कि अगर कंपाइलर यहाँ कुछ भी नहीं किया है, आप नैनो दूसरे परिशुद्धता टाइमर है जब तक आप एक लाभ नोटिस नहीं जा रहे हैं अंततः, यह L_SUBFR की अपनी परिभाषा पर निर्भर करता है।


बस किक के लिए, यहां एक उदाहरण है कि संकलक क्या कर सकता है:

  अहस्ताक्षरित int i = getValue (); यदि (i & gt; = 10 & amp; amp; i & lt; = 200) {}   

ऐसा कोड जो कम से कम लगता है, इतना अपूरणीय है, इसे कंपाइलर द्वारा अनुकूलित किया जा सकता है: < / P>

  अहस्ताक्षरित int i = getValue (); यदि (i - 10 & lt; = 190) {}    

No comments:

Post a Comment