Game Coding Complete, 3rd Edition, पुस्तक में लेखक डेटा संरचना आकार और दोनों को एक्सेस प्रदर्शन बढ़ाने के लिए एक तकनीक का उल्लेख करता है। संक्षेप में यह इस तथ्य पर निर्भर करता है कि जब सदस्य चर मेमोरी गठबंधन होते हैं तो आप प्रदर्शन प्राप्त करते हैं। यह एक स्पष्ट संभावित अनुकूलन है कि संकलक इसका लाभ उठाएंगे, लेकिन यह सुनिश्चित करके कि प्रत्येक चर को गठबंधन किया गया है, वे डेटा संरचना के आकार को सूखते हैं।अंतरिक्ष और प्रदर्शन बूस्ट के लिए बिट संरेखण
या कि कम से कम अपने दावे को किया गया था।
वास्तविक प्रदर्शन वृद्धि, वह राज्यों, अपने दिमाग का उपयोग करते हुए और यह सुनिश्चित करना है कि आपके संरचना ठीक से गति बढ़ जाती है का लाभ लेने जबकि संकलक ब्लोट रोकने लेने के लिए डिज़ाइन किया गया है कर रहा है।
#pragma pack(push, 1)
struct SlowStruct
{
char c;
__int64 a;
int b;
char d;
};
struct FastStruct
{
__int64 a;
int b;
char c;
char d;
char unused[ 2 ]; // fill to 8-byte boundary for array use
};
#pragma pack(pop)
एक अनिर्दिष्ट परीक्षा में ऊपर struct
वस्तुओं का उपयोग करते हुए वह (192ms
की तुलना में 222ms
) एक प्रदर्शन 15.6%
की वृद्धि हुई है और FastStruct
के लिए एक छोटे आकार की रिपोर्ट: वह निम्नलिखित कोड का टुकड़ा प्रदान करता है। यह सब मेरे लिए कागज पर समझ में आता है, लेकिन यह मेरी परीक्षण के तहत पकड़ में विफल रहता है:
एक ही समय और आकार (char unused[ 2 ]
के लिए बढ़ रहा है) परिणाम!
अब अगर #pragma pack(push, 1)
केवल FastStruct
लिए अलग है (या पूरी तरह से हटा) हम एक अंतर देखते हैं:
तो, अंत में, यहाँ सवाल निहित है: (विशेष रूप से VS2010) आधुनिक compilers क्या पहले से ही बिट संरेखण के लिए अनुकूलित है, इसलिए प्रदर्शन वृद्धि की कमी (लेकिन एक पक्ष को प्रभावित के रूप में संरचना आकार में वृद्धि, जैसे माइक मकशैफ्री कहा)? या क्या मेरा परीक्षण किसी भी महत्वपूर्ण परिणाम को वापस करने के लिए पर्याप्त गहन/अनिवार्य नहीं है?
परीक्षणों के लिए मैंने गणित संचालन, स्तंभ-प्रमुख बहु-आयामी सरणी ट्रैवर्सिंग/चेकिंग, मैट्रिक्स ऑपरेशंस इत्यादि से अनगिनत __int64
सदस्य पर विभिन्न प्रकार के कार्य किए। इनमें से कोई भी संरचना के लिए अलग-अलग नतीजों का उत्पादन नहीं करता है।
अंत में, भले ही उनकी कोई प्रदर्शन वृद्धि हुई थी, यह अभी भी कम से कम स्मृति के उपयोग रखने के लिए ध्यान में रखने के लिए एक उपयोगी tidbit है। लेकिन अगर मैं प्रदर्शन को बढ़ावा देता हूं (चाहे कितना नाबालिग हो) मैं इसे प्यार करूंगा कि मैं बस नहीं देख रहा हूं।
तथ्य यह है कि आप सभी परीक्षणों के लिए एक ही समय में संकेत देते हैं कि आप लंबे समय तक नहीं चल रहे हैं। समय कोड का संकल्प शायद कोई अंतर दिखाने के लिए पर्याप्त नहीं है। –
शायद आपके परीक्षणों के दौरान प्रश्न में चर का उपयोग किया जा रहा था, यह एक रजिस्टर में कैश किया गया था। एक int64 वैरिएबल को एक मेमोरी सीमा पार करने के लिए जहां इसे लाने के लिए दो विधानसभा निर्देशों की आवश्यकता होगी, यह आवश्यक रूप से धीमा हो जाएगा। –
@ बोपरसन: अधिक संभावना है कि कंपाइलर ने उन्हें एक ही कोड का उत्पादन करने के लिए अनुकूलित किया है। – Puppy