что было бы быстрее?
bool same=(Guid)Identifier==id;
bool same=String.Equals(string1,string2, StringComparison.OrdinalIgnoreCase);
что было бы быстрее?
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 String-String, сравнение UUID занимает примерно 1/4 времени как сравнение строк.
Однако приведение String- > UUID дорого. Гораздо дороже преобразования UUID- > String. Оба они дороже, чем любой из методов сравнения.
Итак: Если у вас есть два UUID, сравните UUID напрямую. Если у вас есть две строки, напрямую сравните строки. Если у вас есть один String и один UUID, преобразуйте UUID в String и сравните строки.
A Guid == Guid будет использовать код типа:
public bool Equals(Guid g)
{
if (g._a != this._a)
{
return false;
}
if (g._b != this._b)
{
return false;
}
в то время как сравнение строк в вашем примере будет использовать небезопасное сравнение указателей.
Без бенчмаркинга я подозреваю, что Guid будет быстрее, но мы говорим о маргинальном. И вам действительно нужно проверять количество сравнений с несколькими миллионами, чтобы это имело значение.
Оба сравнения будут разрастаться рано, то есть слева направо, так что это также повлияет на скорость. Сравнение строк имеет больше проверок перед тем, как произойдет сравнение, и еще один вызов метода.
Сравнение GUID - это memcmp из 16 байтов. Это не будет хуже, чем сравнение строк, но если вы заботитесь о производительности, вы не должны использовать управляемый код.
.NET Guid - это 16-байтовая структура, которая, представленная в виде строки, будет отформатирована в этом шаблоне "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", который составляет около 32 символов.
Представленный в виде GUID, он будет принимать 16 байт и представленный как строка, потребуется 32 * 2 = 64 байта.
Так GUID.Equals() должен работать лучше.
Также GUID.Equals(GUID) будет работать лучше, чем guid1 == guid2, потому что в первом боксе не участвует.