2010-02-06 14 views
7

मान लीजिए मैं का यूनिकोड स्ट्रिंग के लिए प्रकार चार * एक सूचक है, और मैं लंबाई पता:मार्शल.PtrToStringUni() बनाम नई स्ट्रिंग()?

char* _unmanagedStr; 
int _unmanagedStrLength; 

और मैं 2 तरीके यह नेट स्ट्रिंग के लिए कनवर्ट करने के लिए है:

Marshal.PtrToStringUni((IntPtr)_unmanagedStr, _unmanagedStrLength); 

और

new string(_unmanagedStr, 0, _unmanagedStrLength); 

मेरे परीक्षण में, दोनों कॉल मुझे बिल्कुल वैसा ही परिणाम देता है, लेकिन new string() तेजी Marshal.PtrToStringUni() से 1.8x बार की तरह है।

उस प्रदर्शन में अंतर क्यों है? क्या दोनों के बीच कोई और कार्यात्मक अंतर है?

उत्तर

9

उपलब्ध स्रोत कोड (रोटर) से निर्णय, सिस्टम.स्ट्रिंग (चार *) कन्स्ट्रक्टर CtorCharPtr() के माध्यम से भारी अनुकूलित कोड पथ का उपयोग करता है, यह FastAllocateString() के साथ स्ट्रिंग आवंटित करता है। मार्शल.PtrToStringUni() एक पूरी तरह से अलग कोड पथ का पालन करता है, यह सी ++ में लिखा गया है और "फास्ट आवंटक" के लाभ के बिना स्ट्रिंग को दो बार कॉपी करना प्रतीत होता है।

स्पष्ट रूप से, उसी प्रोग्रामर ने इस पर काम नहीं किया। कोड निश्चित रूप से एक ही टीम नहीं है क्योंकि कोड एक अलग प्रोग्रामिंग मॉडल फिट बैठता है। आम तौर पर निकटतम प्रबंधक शायद चार स्तर ऊपर था।

सुनिश्चित नहीं है कि यह कैसे सहायक होगा, तेज़ का उपयोग करें। मिशप विंडोज पर एक समान प्रकार का अपवाद उत्पन्न करेगा।

8

दूसरा सीएलएस अनुपालन नहीं है, असुरक्षित कोड की आवश्यकता है और शायद अनिश्चित व्यवहार हो सकता है, यही कारण है कि शायद यह तेज़ है। अप्रबंधित पते के सूचक को pin की आवश्यकता भी है या कचरा कलेक्टर इसे फिर से आवंटित कर सकता है जो अधिक घिरा हुआ कोड पर ले जाता है। जब तक आप यह निर्धारित नहीं करते कि यह आपके एप्लिकेशन के लिए एक बाधा है तो आप शायद PtrToStringUni फ़ंक्शन का उपयोग करना चाहेंगे।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^