簡體   English   中英

與字符串比較相比,GUID強制轉換和比較的成本是多少

[英]How expensive is a GUID cast and comparison vs a string comparison

哪個會更快?

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表現更好,因為前者沒有涉及拳擊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM