सैम के साथ परीक्षण कोड की तुलना करने पर, मैंने निर्धारित किया कि हम दोनों सही हैं!
हालांकि, विभिन्न चीजों के बारे में:
- मेमोरी तक पहुँचना (पढ़ना और लिखना) जहाँ कहीं भी है , उतनी ही तेज़ है - स्टैक, ग्लोबल या हीप।
- का आवंटन यह, हालांकि, सबसे तेजी से ढेर पर ढेर पर सबसे धीमी है और।
यह इस प्रकार है: stack
< global
< heap
। (आवंटन समय)
तकनीकी रूप से, स्टैक आवंटन वास्तव में एक आवंटन नहीं है, रनटाइम बस स्टैक (फ़्रेम) का एक हिस्सा सुनिश्चित करता है जो कि सरणी के लिए आरक्षित है।
मैं दृढ़ता से इस के साथ सावधान रहने की सलाह देता हूं, हालांकि।
मैं निम्नलिखित सलाह देता हूं:
- जब आपको अक्सर एरे बनाने की आवश्यकता होती है जो फ़ंक्शन को कभी नहीं छोड़ता (जैसे इसके संदर्भ को पास करके), स्टैक का उपयोग करना एक बहुत बड़ा सुधार होगा।
- यदि आप किसी सरणी को रीसायकल कर सकते हैं, तो जब भी आप ऐसा कर सकते हैं! लंबी अवधि के वस्तु भंडारण के लिए ढेर सबसे अच्छी जगह है। (प्रदूषणकारी वैश्विक मेमोरी अच्छी नहीं है; स्टैक फ्रेम गायब हो सकते हैं)
( नोट : 1. केवल मूल्य प्रकारों पर लागू होता है; संदर्भ प्रकार ढेर पर आवंटित किए जाएंगे और लाभ 0 पर कम हो जाएगा)
प्रश्न का उत्तर देने के लिए: मुझे किसी भी बड़े-स्टैक टेस्ट में किसी भी समस्या का सामना नहीं करना पड़ा है।
मेरा मानना है कि केवल संभावित समस्याएं एक स्टैक ओवरफ्लो हैं, यदि आप अपने फ़ंक्शन कॉल से सावधान नहीं हैं और सिस्टम से कम चल रहा है तो अपने थ्रेड (ओं) को बनाते समय मेमोरी से बाहर चल रहे हैं।
नीचे दिया गया अनुभाग मेरा प्रारंभिक उत्तर है। यह गलत है-ईश और परीक्षण सही नहीं हैं। इसे केवल संदर्भ के लिए रखा गया है।
मेरा परीक्षण बताता है कि स्टैक-आवंटित मेमोरी और वैश्विक मेमोरी कम से कम 15% धीमी है (सरणियों के उपयोग के लिए हीप-आवंटित मेमोरी की तुलना में 120% अधिक समय लेता है)!
यह मेरा परीक्षण कोड है , और यह एक नमूना आउटपुट है:
Stack-allocated array time: 00:00:00.2224429
Globally-allocated array time: 00:00:00.2206767
Heap-allocated array time: 00:00:00.1842670
------------------------------------------
Fastest: Heap.
| S | G | H |
--+---------+---------+---------+
S | - | 100.80 %| 120.72 %|
--+---------+---------+---------+
G | 99.21 %| - | 119.76 %|
--+---------+---------+---------+
H | 82.84 %| 83.50 %| - |
--+---------+---------+---------+
Rates are calculated by dividing the row's value to the column's.
मैंने विंडोज 8.1 प्रो (अपडेट 1 के साथ) पर परीक्षण किया, एक i7 4700 एमक्यू का उपयोग करते हुए, .NET 4.5.1 के तहत
मैंने x86 और x64 दोनों के साथ परीक्षण किया और परिणाम समान हैं।
संपादित करें : मैंने सभी थ्रेड्स 201 एमबी के स्टैक आकार में वृद्धि की, नमूना आकार 50 मिलियन और घटकर पुनरावृत्तियों को घटाकर 5.
परिणाम उपरोक्त के समान हैं :
Stack-allocated array time: 00:00:00.4504903
Globally-allocated array time: 00:00:00.4020328
Heap-allocated array time: 00:00:00.3439016
------------------------------------------
Fastest: Heap.
| S | G | H |
--+---------+---------+---------+
S | - | 112.05 %| 130.99 %|
--+---------+---------+---------+
G | 89.24 %| - | 116.90 %|
--+---------+---------+---------+
H | 76.34 %| 85.54 %| - |
--+---------+---------+---------+
Rates are calculated by dividing the row's value to the column's.
हालांकि, ऐसा लगता है कि स्टैक वास्तव में धीमा हो रहा है ।