2009-04-03 17 views
41

के रूप में GUID ऑब्जेक्ट या ग्रिड स्ट्रिंग का उपयोग करते हुए GuidDictionary के लिए इंडेक्स के रूप में उपयोग करते समय, Guid ऑब्जेक्ट या ग्रिड की स्ट्रिंग प्रस्तुति का उपयोग करना बेहतर है?प्रदर्शन -

मैंने ऑब्जेक्ट का उपयोग करने के लिए स्ट्रिंग का उपयोग कर कुछ कोड को दोबारा प्रतिक्रिया दी, क्योंकि new Guid() सभी जगहों पर कॉल किया गया था। लेकिन इससे मुझे आश्चर्य हुआ कि प्रदर्शन के मुद्दे क्या हो सकते हैं। (संग्रह काफी छोटे हैं, लेकिन वे कई बार पुनरावृत्त हो जाते हैं।)

उत्तर

68

Guid तेज होना चाहिए, क्योंकि तुलना सरल है - केवल कुछ प्रत्यक्ष बाइट्स। स्ट्रिंग में एक अव्यवस्था और बहुत अधिक काम शामिल है।

बेशक

- आप ;-p प्रोफ़ाइल सकता

साक्ष्य:

Searching for 7f9b349f-f36f-94de-ad96-04279ddf6ecf 
As guid: 466; -1018643328 
As string: 512; -1018643328 
Searching for 870ba465-08f2-c872-cfc9-b3cc1ffa09de 
As guid: 470; 1047183104 
As string: 589; 1047183104 
Searching for d2376f8a-b8c9-4633-ee8e-9679bb30f918 
As guid: 423; 1841649088 
As string: 493; 1841649088 
Searching for 599889e8-d5fd-3618-4c4f-cb620e6f81bb 
As guid: 488; -589561792 
As string: 493; -589561792 
Searching for fb64821e-c541-45f4-0fd6-1c772189dadf 
As guid: 450; 1389733504 
As string: 511; 1389733504 
Searching for 798b9fe5-ba15-2753-357a-7637161ee48a 
As guid: 415; 779298176 
As string: 504; 779298176 
Searching for 12ba292e-8e59-e5d0-7d04-e811a237dc21 
As guid: 457; 558250944 
As string: 564; 558250944 
Searching for 05b3ce14-dfbf-4d3a-1503-ced515decb81 
As guid: 413; 1658205056 
As string: 504; 1658205056 
Searching for 8db4a556-0a65-d8cb-4d0d-0104245d18b8 
As guid: 415; 696231936 
As string: 506; 696231936 
Searching for c49cf80c-5537-fba5-eebd-8ad21bba09c4 
As guid: 459; 2100976384 
As string: 557; 2100976384 

के आधार पर:

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Linq; 
static class Program 
{ 

    static void Main() 
    { 
     Random rand = new Random(123456); 
     int COUNT = 1000; 
     Dictionary<Guid, int> guids = new Dictionary<Guid, int>(COUNT); 
     Dictionary<string, int> strings = new Dictionary<string, int>(
      COUNT, StringComparer.Ordinal); 

     byte[] buffer = new byte[16]; 
     for (int i = 0; i < COUNT; i++) 
     { 
      rand.NextBytes(buffer); 
      Guid guid = new Guid(buffer); 
      int val = rand.Next(); 
      guids.Add(guid, val); 
      strings.Add(guid.ToString(), val); 
     } 

     for(int i = 0 ; i < 10 ; i++) { 
      int index = rand.Next(COUNT); 
      Guid guid = guids.Keys.Skip(index).First(); 
      Console.WriteLine("Searching for " + guid); 
      int chk = 0; 
      const int LOOP = 5000000; 
      Stopwatch watch = Stopwatch.StartNew(); 
      for (int j = 0; j < LOOP; j++) 
      { 
       chk += guids[guid]; 
      } 
      watch.Stop(); 
      Console.WriteLine("As guid: " + watch.ElapsedMilliseconds 
        + "; " + chk); 
      string key = guid.ToString(); 
      chk = 0; 
      watch = Stopwatch.StartNew(); 
      for (int j = 0; j < LOOP; j++) 
      { 
       chk += strings[key]; 
      } 
      watch.Stop(); 
      Console.WriteLine("As string: " + watch.ElapsedMilliseconds 
        + "; " + chk); 
     } 
     Console.ReadLine(); 

    } 
} 
+5

ओह, आप मेरे लिए यह नहीं करेंगे?;) – Benjol

+1

वाह, आपने किया! जवाब तुम्हारा है, महोदय! – Benjol

+0

मुस्कुराहट के साथ सेवा; -पी –

2

संग्रह काफी छोटे हैं, लेकिन वे के दोहराया बहुत से समय

यदि आप पुनरावृत्त कर रहे हैं, तो महत्वपूर्ण तुलना करने की कोई कुंजी नहीं है। यदि आप कुंजी द्वारा जोड़/संशोधित या देख रहे हैं, तो कुंजी को धोया जाएगा और हैश की तुलना की जाएगी; केवल अगर हैश बराबर हैं तो चाबियों की तुलना की जाएगी।

इसलिए, जब तक कि आप कई हश टकरावों के साथ विशाल शब्दकोशों पर बहुत से महत्वपूर्ण आधारित संचालन नहीं कर रहे हैं, तो महत्वपूर्ण तुलनाओं की कुंजी की गति एक प्रमुख कारक नहीं होगी।

+0

हाँ, मेरे हिस्से पर बुरा शब्द। यदि कोई लुकअप नहीं है तो कोई शब्दकोष नहीं है! – Benjol

+0

एक शब्दकोश सुनिश्चित करता है कि कुंजी अद्वितीय हैं और ओ (लॉग एन) सम्मिलन; यह बहुत उपयोगी हो सकता है भले ही आप केवल पुनरावृत्त करने जा रहे हों। – Richard

+0

(मेरी पोस्ट पर आपकी टिप्पणी का उत्तर देखें) –

1

मेरा पहला विचार यह होगा कि Guid ऑब्जेक्ट्स तेज़ी से हैं, लेकिन यदि आपको स्ट्रिंग के रूप में कुछ इनपुट मिलता है और इसे GUIDs (जो अक्सर बदल नहीं रहे हैं) के एक छोटे से संग्रह (हैशसेट) में खोजना है, तो हो सकता है तेजी से उन्हें स्ट्रिंग के रूप में संग्रहीत करने के लिए हो सकता है, क्योंकि:

  • एक GUID-शब्दकोश में एक स्ट्रिंग खोज के लिए, आप (त्रुटि आदि की जाँच भी शामिल है) स्ट्रिंग पार्स करने के लिए है, Guid संरचना बनाने, हैश कोड प्राप्त , हैश लुकअप और GUID बाइट्स की एक अंतिम तुलना करें।

  • स्ट्रिंग-डिक्शनरी में स्ट्रिंग को खोजने के लिए, आपको स्ट्रिंग का हैश बनाना होगा (Guid स्ट्रक्चर बनाने से संभवतः तेज़), हैश को ढूंढें और एक स्ट्रिंग तुलना करें। उदाहरण के लिए, यदि आप कई GUID संग्रह में नहीं होने की अपेक्षा करते हैं, तो हैश तुलना अक्सर असफल हो जाती है, आपको स्ट्रिंग तुलना करने की भी आवश्यकता नहीं होती है (जो ऊपर बिंदु 1 से GUID-तुलना की तुलना में थोड़ा अधिक समय लेता है)

आप पहले से ही इनपुट के रूप में Guid संरचनाओं है (उदाहरण के लिए, क्योंकि तुमने कुछ वैधता की जाँच इनपुट तारों पर) निश्चित रूप से यह अब तक उन्हें शब्दकोश में सूचकांक के रूप में पुन: उपयोग करना बेहतर है।

लेकिन: डिजाइन स्पष्टता के मद्देनजर आप Guid संरचनाओं का उपयोग करना चाहिए और केवल कि बदलने के लिए, यदि आप वास्तव में प्रदर्शन मुसीबतों में चलाने (जो सभी कोड के 99% में प्रदर्शन की तुलना में कहीं अधिक महत्वपूर्ण है) के बिंदु (और रूपरेखा से दिखाता है कि आपको स्ट्रिंग समाधान से लाभ मिलता है)।

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