与字符串比较相比,GUID强制转换和比较的成本是多少

zsh*_*arp 13 c#

哪个会更快?

bool same=(Guid)Identifier==id;

bool same=String.Equals(string1,string2, StringComparison.OrdinalIgnoreCase);
Run Code Online (Sandbox Code Playgroud)

Rub*_*ias 30

我用过这段代码:

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();
Run Code Online (Sandbox Code Playgroud)

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

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!
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

  • 您的基准测试在字节 1 上退出比较,这是最大的努力。如果你比较更多的字节,时间会相差更大。但是时间差异并不像您声称的那么大,因为您已将 .ToString() 包含在循环中。字符串 a = 受害者.ToString(); 字符串 b = target.ToString(); for (int i = 0; i &lt; 10000000; i++) { bool equal = String.Equals(a, b, StringComparison.OrdinalIgnoreCase); } (2认同)

Mic*_*lis 13

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

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

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