我一直在尝试使用带有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);
答案 0 :(得分:1)
很显然,数据类型越小,它就会越快。但是,使用GUID为了使字典具有唯一的标识符,可以用多种方法来帮助您。当然,它有点慢,但是可以保证它是唯一的,并且仅为此目的而创建。任何看到GUID的人都会知道为什么会有它,而您为绩效付出的代价通常可以忽略不计,并且不会对整体绩效产生很大的影响。
例如,决定GUID和int的关键因素是您是否需要数据库实体的通用唯一性。如果不是,那么使用原始类型同样可以。
答案 1 :(得分:0)
向导具有several disadvantages(无序,调试麻烦,丑陋,导致聚集索引碎片等),因此,如果您打算使用它们,则应该真的需要它们的优点(快速创建,易于复制/同步/合并数据库)。如果您决定使用它们,则按原样使用它们(不将它们转换为字节数组等)可能是兼顾性能和意图表达的最佳选择。
如果决定使用更多原始类型作为键(Int64,Int32),请不要依赖rng的唯一性。对我来说似乎很冒险。我希望对数据库进行一次往返操作,以确保随机密钥是唯一的,或者甚至更好地从序列中获取下一个id,因为当密钥是连续的时,调试要容易得多。