आप अपने कोड को ध्यान से प्रोफाइल और पाया कि एक सापेक्ष ऑपरेटर एक आंतरिक पाश में प्रमुख लागत है है, तो वहाँ एक अनुकूलन है कि मदद कर सकता है है। आप (32 बिट मूल्यों के लिए) गणित छोड़ बदलाव का उपयोग कर एक पूर्णांक के हस्ताक्षर निर्धारित करने के लिए चाल के साथ पहले से ही परिचित हो सकते हैं:
sign = (x >> 31) | 1;
यह शब्द भर में हस्ताक्षर बिट फैली हुई है, तो ऋणात्मक मानों -1 और सकारात्मक उपज महत्व देता है 0. तो थोड़ा 0 तो सेट कर दिया जाता है कि हम केवल एक मात्रा है कि सापेक्ष तो यह एक ही चाल परिणाम रैप करने के लिए इस्तेमाल किया जा सकता से भी कम है के आधार पर मानों incrementing रहे हैं कि सकारात्मक मूल्यों में 1.
परिणाम:
val += inc;
val -= modulo & (static_cast<int32_t>(((modulo - 1) - val)) >> 31);
वैकल्पिक रूप से
, यदि आप कर रहे हैं decrementing सापेक्ष कम से कम मूल्यों से फिर प्रासंगिक कोड है:
int32_t signedVal = static_cast<int32_t>(val - dec);
val = signedVal + (modulo & (signedVal >> 31));
मैं static_cast ऑपरेटरों जोड़ दिया है क्योंकि मैं uint32_t में गुजर रहा था, लेकिन आप उन्हें आवश्यक नहीं मिल सकती है।
इस के रूप में एक साधारण% ऑपरेटर के लिए विरोध ज्यादा मदद करता है? यह आपके कंपाइलर और सीपीयू आर्किटेक्चर पर निर्भर करता है। मैंने पाया कि वीएस2012 के तहत संकलित होने पर मेरे आई 3 प्रोसेसर पर एक साधारण पाश 60% तेज हो गया, हालांकि रास्पबेरी पीआई में एआरएम 11 चिप पर और जीसीसी के साथ संकलन में मुझे केवल 20% सुधार मिला।
स्रोत
2013-05-08 09:37:52
"% ऑपरेटर की तुलना करते हुए पर्याप्त कुशल छोरों से जुड़े इस कोड है?" आप हमें बताते हैं, आप प्रोग्राम का उपयोग कर रहे हैं। क्या यह धीमा लगता है? क्या आप भी ध्यान दे सकते हैं? क्या आपने प्रोफाइल किया है और यह धीमा होने के लिए पाया है? – GManNickG
वह आकार पर निर्भर करेगा। यदि 'बी = 1000000000' और' सी = 3'। इसमें कुछ समय लगेगा ... – Mysticial
क्या आप लक्ष्य सीपीयू और कंपाइलर बता सकते हैं? इसके बिना किसी भी दृष्टिकोण की तुलना करना असंभव है। – fghj