哪一个更快:字典键的String,BigInteger或Guid?

问题描述 投票:0回答:2

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

以下是具有不同Key类型的词典:

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);
c# .net dictionary unity3d guid
2个回答
1
投票

显然,数据类型越小,它就越快。但是,为了使用GUID为您的字典提供唯一标识符,可以通过多种方式提供帮助。它当然有点慢,但它保证是独一无二的,仅为此目的而创建。任何看到GUID的人都会知道为什么会出现这种情况+您在性能方面支付的费用通常可以忽略不计,并且不会对整体性能产生太大影响。

例如,决定GUID和int之间的关键因素是您是否需要数据库实体的通用唯一性。如果没有,你对原始类型同样好。


0
投票

Guids有several disadvantages(无序,调试繁琐,大,丑,导致碎片到聚簇索引等),因此如果您打算使用它们,您应该真正需要它们的优势(快速创建,轻松复制/同步/合并数据库)。如果您决定使用它们然后按原样使用它们(不将它们转换为字节数组等)可能是关于性能和意图揭示的最佳选择。

如果您决定使用更原始的类型作为键(Int64,Int32),请不要依赖于rng的唯一性。这对我来说似乎有风险。我更喜欢对数据库进行往返,以确保随机密钥是唯一的,或者甚至更好地从序列中获取下一个id,因为当密钥是顺序的时,调试会更容易。

© www.soinside.com 2019 - 2024. All rights reserved.