मैं इन अनुकूलन पर कोई विशेषज्ञ नहीं हूं, लेकिन जैसा कि मैं इसे समझता हूं कि आप अपने मैट्रिक्स प्रकार पर अंकगणितीय ऑपरेटरों को परिभाषित करके काम के बारे में बात कर रहे हैं, उदाहरण के लिए A+B+C*D
मैट्रिक्स वापस नहीं करता है, यह एक प्रॉक्सी ऑब्जेक्ट देता है जो को मैट्रिक्स में परिवर्तित कर सकता है। ऐसा तब होता है जब इसे M
पर असाइन किया जाता है, और रूपांतरण कोड परिणाम मैट्रिक्स के प्रत्येक सेल को सबसे प्रभावी माध्यमों से गणना करेगा, लाइब्रेरी डिज़ाइनर अस्थायी मैट्रिक्स ऑब्जेक्ट से परहेज कर सकते हैं।
तो, मान लीजिए आप से operator+=
का उपयोग कर, तो आप इस एक बार सामान्य, सी ++ 03 शैली की नकल इलिजन है की तरह कुछ मिलता था हमेशा की तरह operator+
लागू चालाक अन्य कुछ नहीं किया तो कार्यक्रम M = A + B + C * D;
शामिल में लात मारी:
Matrix tmp1 = C;
tmp1 *= D;
Matrix tmp2 = A;
tmp2 += B;
tmp2 += tmp1;
M = tmp2;
देरी मूल्यांकन के साथ, आप मिल सकता है कुछ अधिक की तरह:
for (int i = 0; i < M.rows; ++i) {
for (int j = 0; j < M.cols; ++j) {
/* not necessarily the best matrix multiplication, but serves to illustrate */
c_times_d = 0;
for (int k = 0; k < C.cols; ++k) {
c_times_d += C[i][k] * D[k][j];
}
M[i][j] = A[i][j] + B[i][j] + c_times_d;
}
}
जबकि "कुछ भी चालाक" कोड कुछ अलग अतिरिक्त लूप और बहुत अधिक असाइनमेंट करेगा।
जहां तक मुझे पता है, semantics ले जाएँ इस मामले में ज्यादा मदद नहीं करता है। तुम क्या लिखा है में कुछ भी A
, B
, C
या D
से स्थानांतरित करने के लिए हमें की अनुमति देता है, तो हम के बराबर के साथ समाप्त करने के लिए जा रहे हैं:
Matrix tmp1 = C;
tmp1 *= D;
Matrix tmp2 = A;
tmp2 += B;
tmp2 += std::move(tmp1);
M = std::move(tmp2);
तो अर्थ विज्ञान के लिए कदम और कुछ के साथ मदद नहीं की है आखिरी बिट की तुलना में, जहां ऑपरेटरों के रैवल संस्करण नियमित रूप से बेहतर होते हैं। यदि आपने std::move(A) + std::move(B) + std::move(C) * std::move(D)
लिखा है, तो हमें और अधिक उपलब्ध है, क्योंकि हमें C
या A
से कॉपी नहीं करना पड़ेगा, लेकिन मुझे अभी भी नहीं लगता कि परिणाम देरी-मूल्यांकन कोड के जितना अच्छा है।
असल में, ले जाने के अर्थ विज्ञान अनुकूलन के कुछ महत्वपूर्ण भागों में देरी मूल्यांकन द्वारा प्रदान के साथ मदद नहीं है:
1) देरी मूल्यांकन के साथ, मध्यवर्ती परिणाम वास्तव में कभी के रूप में पूरा मैट्रिक्स अस्तित्व के लिए की जरूरत है। Semantics ले जाएँ संकलक को किसी बिंदु पर पूर्ण मैट्रिक्स A+B
मेमोरी में सहेजने से नहीं बचाते हैं।
2) देरी से मूल्यांकन के साथ, हम पूरी अभिव्यक्ति की गणना समाप्त करने से पहले M
संशोधित करना प्रारंभ कर सकते हैं। अर्थशास्त्र को ले जाएं संकलक को संशोधित करने में मदद नहीं करते हैं: भले ही संकलक संभावित अवसर को खोजने के लिए पर्याप्त स्मार्ट हो, भले ही गैर-अस्थायी में परिवर्तन को अपने सही क्रम में रखा जाना चाहिए यदि अपवाद को फेंकने का कोई खतरा है, क्योंकि यदि A + B + C * D
का कोई भी भाग फेंकता है, तो M
इसे शुरू होने के बाद छोड़ा जाना चाहिए।
मेटाप्रोग्रामिंग मूल्यांकन में देरी के विपरीत काफी विपरीत है। एक दिलचस्प सवाल है, लेकिन आपके विचारों का एक नमूना उपयोगी होगा। –
@MooingDuck: अभिव्यक्ति टेम्पलेट कभी-कभी प्रतियों को समाप्त करने से अधिक सक्षम बनाता है। उदाहरण के लिए 'ए * बी + सी' अभिव्यक्ति में, अभिव्यक्ति टेम्पलेट एफएमए निर्देशों को लागू करके गणना को अनुकूलित कर सकता है, आदि –