जो लोग प्रदर्शन की देखभाल के लिए ..
public T[] Stack<T>.ToArray();
public void Stack<T>.CopyTo(T[] array, int arrayIndex);
मैं एक किसी न किसी कार्यक्रम में लिखा था (लिंक पोस्ट के अंत में प्रदान किया जाएगा) प्रदर्शन को मापने और: वहाँ कुछ अन्य तरीके कैसे प्रदर्शन में बड़ी हानि के बिना मूल ढेर सदस्यों के माध्यम से पुनरावृति करने के लिए कर रहे हैं पहले से ही सुझाव दिया कार्यान्वयन के लिए दो टेस्ट जोड़ा, और दो टेस्ट (Clone1 और Clone2 देखें) toArray और CopyTo तरीकों के लिए (देखें Clone3 और Clone4, उन दोनों का उपयोग अधिक कुशल Array.Reverse विधि)।
public static class StackExtensions
{
public static Stack<T> Clone1<T>(this Stack<T> original)
{
return new Stack<T>(new Stack<T>(original));
}
public static Stack<T> Clone2<T>(this Stack<T> original)
{
return new Stack<T>(original.Reverse());
}
public static Stack<T> Clone3<T>(this Stack<T> original)
{
var arr = original.ToArray();
Array.Reverse(arr);
return new Stack<T>(arr);
}
public static Stack<T> Clone4<T>(this Stack<T> original)
{
var arr = new T[original.Count];
original.CopyTo(arr, 0);
Array.Reverse(arr);
return new Stack<T>(arr);
}
}
परिणाम हैं:
- Clone1: 318,3766 एमएस
- Clone2: 269,2407 एमएस
- Clone3: 50,6025 एमएस
- Clone4: 37,5233 एमएस - विजेता
जैसा कि हम देख सकते हैं, का उपयोग करने का दृष्टिकोण CopyTo विधि 8 गुना तेज है और साथ ही कार्यान्वयन बहुत सरल और सीधा है। इसके अलावा, मैं ढेर आकार की एक अधिकतम मूल्य पर एक त्वरित अनुसंधान किया: Clone3 और Clone4 परीक्षण OutOfMemoryException से पहले बड़ा ढेर आकार के लिए काम किया होता है:
- Clone1: 67,108,765 तत्वों
- Clone2: 67,108,765 तत्वों
- Clone3: 134,218,140 तत्वों
- Clone4: 134,218,140 तत्वों
के लिए Clone1 और Clone2 ऊपर दिए गए परिणामों अतिरिक्त संग्रह है कि स्पष्ट रूप से/परोक्ष परिभाषित और इसलिए प्रभावित स्मृति खपत थे की वजह से छोटे होते हैं। इस प्रकार, क्लोन 3 और क्लोन 4 दृष्टिकोण एक स्टैक इंस्टेंस को तेज़ी से और कम मेमोरी आवंटन के साथ क्लोन करने की अनुमति देते हैं। आप प्रतिबिंब का उपयोग कर भी बेहतर परिणाम हासिल कर सकते हैं, लेकिन यह एक अलग कहानी :)
पूरा कार्यक्रम सूची पाया जा सकता है here है।
उदासी, अजीब तरह से, इसी क्रम :(की रक्षा नहीं करता है (मुझे लगता है एक ढेर के दोहरे प्रारंभ गलती है तो या एक चाल है?) – SpaceBear
@Angrius: यह क्रम बनाए रखने करता है डबल इन्स्टेन्शियशन एक चाल है कि कारण बनता है। आदेश संरक्षित करने के लिए। – jason
@Angrius: "डबल प्रारंभिकरण" आवश्यक है क्योंकि प्रत्येक व्यक्ति आदेश को उलट देता है। यदि आप इसे दो बार उलट देते हैं तो आपको मूल ऑर्डर मिलता है। – Gabe