कोड की गति बढ़ाएँ: AMD64 पर 16 बाइट से बड़े struct पास न करें
- Neat भाषा के प्रदर्शन को बेहतर बनाने के लिए array को एक struct parameter की जगह तीन pointer parameter के रूप में पास करने के तरीके में बदलाव किया गया।
- Neat array, D भाषा के array से धीमा क्यों था, इसका कारण यह था कि 24-बाइट आकार का array 16 बाइट से बड़ा होने के कारण parameter पास करने के अलग तरीके का उपयोग करता था।
- SystemV AMD64 ABI specification के अनुसार, 16 बाइट से बड़े सभी struct pointer के माध्यम से पास किए जाते हैं।
benchmark के ज़रिए समस्या की पुष्टि
- benchmark के माध्यम से struct पास करने के तरीके और individual field पास करने के तरीके के बीच प्रदर्शन अंतर की पुष्टि की गई।
- struct पास करते समय stack पर allocate और copy करने की प्रक्रिया की आवश्यकता होती है, जबकि individual field पास करते समय वे सीधे SSE register के माध्यम से पास किए जाते हैं।
- individual field पास करने का तरीका struct पास करने की तुलना में लगभग 2 गुना तेज़ प्रदर्शन दिखाता है।
भाषा डिज़ाइनर का चयन
- C API को कॉल करते समय C ABI का पालन करना होता है, लेकिन internally इस्तेमाल होने वाले high-level type को struct के रूप में व्यक्त करना ज़रूरी नहीं है।
- भाषा डिज़ाइनर यह तय कर सकते हैं कि array, tuple, union type आदि कैसे पास किए जाएँगे।
- 16 बाइट से बड़े type को individual field के रूप में पास करना प्रदर्शन सुधार में मदद कर सकता है।
GN⁺ की राय
- यह लेख software optimization में रुचि रखने वाले developers के लिए बहुत उपयोगी है।
- खास तौर पर, यह दिखाता है कि performance-sensitive application विकसित करते समय struct का आकार और उसे पास करने का तरीका महत्वपूर्ण प्रभाव डाल सकते हैं।
- भाषा डिज़ाइनर या API developer इस जानकारी का उपयोग करके प्रदर्शन सुधार के अवसर पा सकते हैं।
1 टिप्पणियां
Hacker News टिप्पणियाँ
struct Vectorparameter type कोconst struct Vector &reference के रूप में pass करने के लिए बदला जा सकता है। pointer bugs वाले बहुत से C++ code में pointers का अनावश्यक उपयोग किया गया था, जबकि reference से pass करना आसान और अधिक सुरक्षित हो सकता था।