कभी-कभी आपके पास केवल एल्गोरिदम होते हैं जो रैखिक समय से बेहतर नहीं हो सकते हैं जिसके लिए अभी भी एक मजबूत प्रदर्शन की मांग है।
एक उदाहरण वीडियो प्रोसेसिंग है जहां आप हर पिक्सेल (अच्छी तरह से) के माध्यम से लूपिंग के बिना एक मूल उदाहरण के रूप में एक छवि / फ्रेम को उज्जवल नहीं बना सकते हैं, मुझे लगता है कि आप कुछ प्रकार के पदानुक्रमित संरचना के साथ कर सकते हैं जो बच्चों द्वारा विरासत में मिली संपत्तियों को इंगित करते हैं जो अंततः छवि टाइल्स में उतरते हैं। लीफ नोड्स के लिए, लेकिन तब आप रेंडरर को प्रत्येक पिक्सेल के माध्यम से लूपिंग की एक उच्च लागत को सुरक्षित करेंगे और कोड शायद सबसे सूक्ष्म-अनुकूलित छवि फ़िल्टर की तुलना में बनाए रखना भी कठिन होगा)।
मेरे क्षेत्र में इस तरह के बहुत सारे मामले हैं। मैं अधिक लीनियर-कॉम्प्लेक्सिटी लूप कर रहा हूं, जिसमें किसी भी तरह के परिष्कृत डेटा संरचना या एल्गोरिथ्म से लाभ उठाने वाले लोगों की तुलना में हर चीज को छूना या सब कुछ पढ़ना है। ऐसा कोई काम नहीं है जिसे तब छोड़ा जा सकता है जब सब कुछ छुआ जाना हो। तो उस बिंदु पर यदि आप अनिवार्य रूप से रैखिक जटिलता के साथ काम कर रहे हैं, तो आपको प्रति बार किए गए काम को सस्ता और सस्ता करना होगा।
इसलिए मेरे मामले में सबसे महत्वपूर्ण और सामान्य अनुकूलन अक्सर डेटा अभ्यावेदन और मेमोरी लेआउट, मल्टीथ्रेडिंग और SIMD हैं (आमतौर पर इस क्रम में डेटा प्रतिनिधित्व सबसे महत्वपूर्ण है, क्योंकि यह बाद के दो को करने की क्षमता को प्रभावित करता है)। मैं इतनी समस्याओं में नहीं भाग रहा हूँ जो पेड़ों, हैश टेबल, एल्गोरिदम को छांटने और उस तरह की चीजों से हल हो जाती हैं। मेरे दैनिक कोड की नस में अधिक है, "प्रत्येक चीज़ के लिए, कुछ करें।"
बेशक यह बात करने के लिए एक और मामला है जब अनुकूलन आवश्यक हैं (और अधिक महत्वपूर्ण बात, जब वे नहीं हैं), माइक्रो या एल्गोरिदम। लेकिन मेरे विशेष मामले में, यदि एक महत्वपूर्ण निष्पादन पथ को अनुकूलन की आवश्यकता होती है, तो 10x + स्पीड गेन अक्सर संदर्भ के बेहतर इलाके के लिए मल्टीथ्रेडिंग, SIMD, और रीग्रेजिंग मेमोरी लेआउट और एक्सेस पैटर्न जैसे सूक्ष्म-स्तरीय अनुकूलन द्वारा प्राप्त किए जाते हैं। यह इतनी बार नहीं है कि मैं कहता हूं, एक बुलबुला सॉर्ट को एक इंट्रोसोर्ट या एक रेडिक्स सॉर्ट या द्विघात-कॉम्प्लेक्सिटी टक्कर टक्कर का स्थान बीवीएच के साथ बदलें ताकि हॉटस्पॉट मिल जाए, जो कहते हैं, गर्म / ठंडे क्षेत्र में बैठने से लाभ।
अब मेरे मामले में मेरा क्षेत्र इतना प्रदर्शन-क्रिटिकल (रिस्ट्रिक्टिंग, फिजिक्स इंजन इत्यादि) है कि एक धीमी लेकिन पूरी तरह से सही रेअट्रैसर जो किसी छवि को प्रस्तुत करने के लिए 10 घंटे का समय लेता है, अक्सर इसे बेकार या एक तेज से अधिक माना जाता है जो पूरी तरह से इंटरैक्टिव है लेकिन वॉटरटाइट रे / ट्राई चौराहे की कमी के कारण हर जगह किरणों के साथ बदसूरत छवियां उत्पन्न होती हैं। इस तरह के सॉफ़्टवेयर की गति प्राथमिक रूप से प्राथमिक गुणवत्ता मीट्रिक है, यकीनन कुछ बिंदु पर शुद्धता से भी अधिक (चूंकि "शुद्धता" एक आलंकारिक विचार है क्योंकि सब कुछ अनुमान लगा रहा है, इसलिए जब तक यह दुर्घटनाग्रस्त या ऐसा कुछ नहीं होता है)। और जब यह मामला है, अगर मैं दक्षता के बारे में नहीं सोचता, तो मुझे लगता है कि मुझे वास्तव में अधिक कुशल डिजाइनों को संभालने के लिए सबसे महंगी डिजाइन स्तर पर कोड को बदलना होगा। तो अगर मैं डॉन
गेमिंग मेरा एक अन्य क्षेत्र है। इससे कोई फर्क नहीं पड़ता कि आपका गेम लॉजिक कितना सही है या आपके कोडबेस को कैसे बनाए रखा जा सकता है और शानदार ढंग से इंजीनियर किया जा सकता है अगर आपका गेम स्लाइड शो की तरह 1 फ्रेम प्रति सेकंड पर चलता है। कुछ क्षेत्रों में गति की कमी वास्तव में अपने उपयोगकर्ताओं के लिए बेकार के आवेदन को प्रस्तुत कर सकती है। खेलों के विपरीत, रेराट्रिंग जैसे क्षेत्रों में कोई "अच्छा पर्याप्त" मीट्रिक नहीं है। उपयोगकर्ता हमेशा अधिक गति चाहते हैं, और औद्योगिक प्रतिस्पर्धा मुख्य रूप से तेज समाधान की तलाश में है। यह कभी भी अच्छा नहीं होगा जब तक कि यह वास्तविक समय नहीं है, जिस बिंदु पर खेल पथ पथ का उपयोग किया जाएगा। और फिर यह शायद अभी भी वीएफएक्स के लिए पर्याप्त नहीं होगा, तब से कलाकार अरबों बहुभुज लोड करना चाहते हैं और 30+ एफपीएस पर अरबों कणों के बीच आत्म-टकराव के साथ कण सिमुलेशन हो सकते हैं।
अब अगर यह किसी भी आराम की बात है, तो इसके बावजूद मैं अभी भी स्क्रिप्टिंग भाषा (लुआ) में लगभग 90% कोड लिखता हूं, जिसमें प्रदर्शन के बारे में कोई चिंता नहीं है। लेकिन मेरे पास कोड की एक असामान्य रूप से बड़ी मात्रा है जो वास्तव में लाखों-अरबों चीजों के माध्यम से लूप करने की आवश्यकता है, और जब आप लाखों-अरबों चीजों के माध्यम से लूप कर रहे हैं, तो आप भोले एकल-थ्रेडेड कोड के बीच एक महाकाव्य अंतर को नोटिस करना शुरू करते हैं जो हर पुनरावृति बनाम कहे जाने वाले कैश मिस का आह्वान करता है, समानांतर पहुंच वाले सन्निहित ब्लॉकों में चल रहा वेक्टर कोड, जहां कोई अप्रासंगिक डेटा कैश लाइन में लोड नहीं होता है।