Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Performance - using Guid object or Guid string as Key

When using a Guid as an index for a Dictionary, is it better to use the Guid object, or the string representation of the Guid?

I just refactored some code which was using string to use the object, because there were new Guid() calls all over the place. But that left me wondering what the performance issues might be. (The collections are fairly small, but they get iterated lots of times.)

like image 418
Benjol Avatar asked Apr 03 '09 08:04

Benjol


People also ask

Is it good to have GUID as primary key?

Having a guid column is perfectly ok like any varchar column as long as you do not use it as PK part and in general as a key column to join tables. Your database must have its own PK elements, filtering and joining data using them - filtering also by a GUID afterwards is perfectly ok.

Why use GUID instead of int?

An INT is certainly much easier to read when debugging, and much smaller. I would, however, use a GUID or similar as a license key for a product. You know it's going to be unique, and you know that it's not going to be sequential.

Can you convert GUID to string?

According to MSDN the method Guid. ToString(string format) returns a string representation of the value of this Guid instance, according to the provided format specifier. Examples: guidVal.


1 Answers

The Guid should be quicker, as the comparison is simpler - just a few direct bytes. The string involves a dereference and lots more work.

Of course - you could profile ;-p

Evidence:

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 

based on:

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();      } } 
like image 172
Marc Gravell Avatar answered Oct 07 '22 06:10

Marc Gravell