Подтвердить что ты не робот

Насколько дорогим является сравнение и сопоставление GUID и сравнение строк

что было бы быстрее?

bool same=(Guid)Identifier==id;

bool same=String.Equals(string1,string2, StringComparison.OrdinalIgnoreCase);
4b9b3361

Ответ 1

Я использовал этот код:

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

Ответ 2

В моем тестировании, выполняющем сравнение UUID-UUID сравнения VS String-String, сравнение UUID занимает примерно 1/4 времени как сравнение строк.

Однако приведение String- > UUID дорого. Гораздо дороже преобразования UUID- > String. Оба они дороже, чем любой из методов сравнения.

Итак: Если у вас есть два UUID, сравните UUID напрямую. Если у вас есть две строки, напрямую сравните строки. Если у вас есть один String и один UUID, преобразуйте UUID в String и сравните строки.

Ответ 3

A Guid == Guid будет использовать код типа:

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

в то время как сравнение строк в вашем примере будет использовать небезопасное сравнение указателей.

Без бенчмаркинга я подозреваю, что Guid будет быстрее, но мы говорим о маргинальном. И вам действительно нужно проверять количество сравнений с несколькими миллионами, чтобы это имело значение.

Оба сравнения будут разрастаться рано, то есть слева направо, так что это также повлияет на скорость. Сравнение строк имеет больше проверок перед тем, как произойдет сравнение, и еще один вызов метода.

Ответ 4

Сравнение GUID - это memcmp из 16 байтов. Это не будет хуже, чем сравнение строк, но если вы заботитесь о производительности, вы не должны использовать управляемый код.

Ответ 5

.NET Guid - это 16-байтовая структура, которая, представленная в виде строки, будет отформатирована в этом шаблоне "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", который составляет около 32 символов.

Представленный в виде GUID, он будет принимать 16 байт и представленный как строка, потребуется 32 * 2 = 64 байта.

Так GUID.Equals() должен работать лучше.

Также GUID.Equals(GUID) будет работать лучше, чем guid1 == guid2, потому что в первом боксе не участвует.