哪一个更快:使用String,BigInteger或Guid作为字典键?

时间:2019-04-27 12:48:07

标签: c# .net dictionary unity3d guid

我一直在尝试使用带有GUID作为关键字的Dictionary构建实体数据库,我只想知道哪个更快,或者与其他人相比占用更少的内存。

以下是具有不同键类型的字典:

字符串

public Dictionary<string, Object> unityObjects;

GUID

public Dictionary<System.Guid, Object> unityObjects;

BigInteger

public Dictionary<BigInteger, Object> unityObjects;

正在使用System.Guid生成字典键:

Guid guid = Guid.NewGuid();

// Using string dictionary
unityObjects.Add(guid.ToString(), myObj);

// Using GUID dictionary
unityObjects.Add(guid, myObj);

// Using BigInteger dictionary
BigInteger bigInt = new BigInteger(guid.ToByteArray());
unityObjects.Add(guid, myObj);

还是应该将较小的唯一标识符与Int32或Int64而不是GUID一起使用? (类似于下面的代码)

System.Random rng = new System.Random();

byte[] buf = new byte[8];
rng.NextBytes(buf);
long longRand = BitConverter.ToInt64(buf, 0);

// A GUID with Int64 data type
long guid = (System.Math.Abs(longRand % (long.MaxValue - 0)) + 0);

2 个答案:

答案 0 :(得分:1)

很显然,数据类型越小,它就会越快。但是,使用GUID为了使字典具有唯一的标识符,可以用多种方法来帮助您。当然,它有点慢,但是可以保证它是唯一的,并且仅为此目的而创建。任何看到GUID的人都会知道为什么会有它,而您为绩效付出的代价通常可以忽略不计,并且不会对整体绩效产生很大的影响。

例如,决定GUID和int的关键因素是您是否需要数据库实体的通用唯一性。如果不是,那么使用原始类型同样可以。

答案 1 :(得分:0)

向导具有several disadvantages(无序,调试麻烦,丑陋,导致聚集索引碎片等),因此,如果您打算使用它们,则应该真的需要它们的优点(快速创建,易于复制/同步/合并数据库)。如果您决定使用它们,则按原样使用它们(不将它们转换为字节数组等)可能是兼顾性能和意图表达的最佳选择。

如果决定使用更多原始类型作为键(Int64,Int32),请不要依赖rng的唯一性。对我来说似乎很冒险。我希望对数据库进行一次往返操作,以确保随机密钥是唯一的,或者甚至更好地从序列中获取下一个id,因为当密钥是连续的时,调试要容易得多。