for (i = 10 ; i-- > 0 ;)
result_array[i] = byte_array[i] & byte_mask[i];
- जा रहे हैं पीछे की ओर पहले से लोड कर प्रोसेसर कैश लाइनों।
- तुलना में कमी सहित कुछ निर्देशों को बचा सकता है।
यह सभी सरणी और प्रोसेसर के लिए काम करेगा। हालांकि, अगर आपको पता है कि आपके सरणी शब्द-संरेखित हैं, तो एक तेज विधि को बड़े प्रकार में डालना और समान गणना करना है।
उदाहरण के लिए, n=16
n=10
के बजाय कहें। फिर इस बहुत तेजी से होगा:
uint32_t* input32 = (uint32_t*)byte_array;
uint32_t* mask32 = (uint32_t*)byte_mask;
uint32_t* result32 = (uint32_t*)result_array;
for (i = 4 ; i-- > 0 ;)
result32[i] = input32[i] & mask32[i];
(बेशक आप uint32_t
के लिए एक उचित प्रकार की जरूरत है, और अगर n
2 के एक शक्ति आप शुरू और/या समाप्त होने को साफ करने की जरूरत नहीं है, इसलिए है कि 32- बिट सामान गठबंधन है।)
भिन्नता: प्रश्न विशेष रूप से परिणाम को अलग सरणी में रखने के लिए कहते हैं, हालांकि यह निश्चित रूप से इनपुट सरणी को संशोधित करने के लिए तेज़ होगा।
स्रोत
2009-03-20 22:53:38
रुको, क्या कैश प्रीफ़ेचर रिवर्स में बेहतर काम करता है? मैंने सोचा कि यह केवल आगे बढ़ने के लिए prefetched। – Crashworks
प्री-लोडिंग प्रोसेसर कैश-लाइनों के बारे में चिंता करना गंभीर समयपूर्व अनुकूलन की तरह लगता है। – Trent
@ ट्रेंट - प्रश्न का * बिंदु * अनुकूलन है। पीछे की ओर भी धीमा नहीं है, तो आप भी हो सकते हैं। @ क्रैशवर्क्स - याद रखें कि कैश लाइनों को गठबंधन किया जाता है, आमतौर पर भारी सीमाओं पर, इसलिए आमतौर पर इसे उन लोगों से पहले बाइट्स में खींचना पड़ता है जिन्हें आप पूछ रहे हैं। –