GUID演员和比较与字符串比较有多贵

哪个会更快?

bool same=(Guid)Identifier==id; bool same=String.Equals(string1,string2, StringComparison.OrdinalIgnoreCase); 

我用过这段代码:

 object victim = Guid.Empty; Guid target = Guid.NewGuid(); Stopwatch sw = new Stopwatch(); sw.Start(); for (int i = 0; i < 10000000; i++){ bool equal = ((Guid) victim) == target; } Console.WriteLine("Direct cast : {0}", sw.Elapsed); sw.Reset(); sw.Start(); for (int i = 0; i < 10000000; i++) { bool equal = Guid.Equals(victim, target); } Console.WriteLine("Guid.Equals : {0}", sw.Elapsed); sw.Reset(); sw.Start(); string a = victim.ToString(); // as suggested by Mikael string b = target.ToString(); for (int i = 0; i < 10000000; i++) { bool equal = String.Equals(a, b, StringComparison.OrdinalIgnoreCase); } Console.WriteLine("String.Equals : {0}", sw.Elapsed); Console.ReadLine(); 

并得到不同值的结果(最佳方案):

 object victim = Guid.Empty; Guid target = Guid.NewGuid(); // Direct cast : 00:00:00.1164198 // Guid.Equals : 00:00:02.1268147 // String.Equals : 00:00:00.4129527 // oh my! 

这个结果是相同的值(更糟糕的情况)

 object victim = Guid.Empty; Guid target = Guid.Empty; // Direct cast : 00:00:00.2793173 // Guid.Equals : 00:00:03.5625948 // String.Equals : 00:00:01.7564302 

在我的测试中进行直接的UUID-UUID比较VS字符串 – 字符串比较时,UUID比较大约需要1/4的时间作为字符串比较。

但是,String-> UUID的转换是昂贵的。 比UUID-> String转换要贵得多。 两者都比任何一种比较方法都贵。

所以:如果你有两个UUID直接比较UUID。 如果你有两个字符串直接比较字符串。 如果您有一个String和一个UUID,请将UUID转换为String并比较字符串。

Guid == Guid会使用如下代码:

 public bool Equals(Guid g) { if (g._a != this._a) { return false; } if (g._b != this._b) { return false; } 

虽然您的示例中的字符串比较将使用不安全的指针比较。

如果不对它进行基准测试,我怀疑Guid会更快,但我们说的是边缘。 而且你真的需要将数百万的比较数量增加到数百万。

两种比较都会提前爆发,意味着从左到右,这也会影响速度。 字符串比较在比较发生之前有更多检查,还有一个方法调用。

GUID比较是一个16字节的memcmp。 它不会比字符串比较更糟糕,但如果你关心性能那么多,你就不应该使用托管代码。

.NET Guid是一个16字节结构,当表示为字符串时,将以此模式“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”格式化,大约32个字符。

因此表示为GUID,它将占用16个字节并表示为字符串,它将需要32 * 2 = 64个字节。

所以GUID.Equals()应该表现得更好。

GUID.Equals(GUID)也会比guid1 == guid2表现得更好,因为前者没有涉及拳击。