Skip to content

Instantly share code, notes, and snippets.

@fl3pp
Last active July 24, 2019 07:32
Show Gist options
  • Save fl3pp/da66bb7a2810a1c7444a845dab51b847 to your computer and use it in GitHub Desktop.
Save fl3pp/da66bb7a2810a1c7444a845dab51b847 to your computer and use it in GitHub Desktop.
EqualityComparer vs Operators Benchmark
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using System.Collections.Generic;
namespace EqualityPerformanceTest
{
public class Person
{
public int Id { get; set; } = 1;
public string Name { get; set; } = "SomeValue";
public bool EqualsUsingOperators(Person other)
{
return
other.Id == Id &&
other.Name == Name;
}
public bool EqualsUsingComparer(Person other)
{
return
EqualityComparer<int>.Default.Equals(other.Id, Id) &&
EqualityComparer<string>.Default.Equals(other.Name, Name);
}
public bool EqualsUsingEquals(Person other)
{
return Id.Equals(other.Id)
&& Name.Equals(other.Name);
}
public bool EqualsUsingTuples(Person other)
{
return (Id, Name) == (other.Id, other.Name);
}
}
public class EqualityTests
{
[Benchmark]
public void UsingOperators()
{
var person = new Person { Id = 1, Name = "Hans" };
var equal = person.EqualsUsingOperators(person);
}
[Benchmark]
public void UsingCompararer()
{
var person = new Person { Id = 1, Name = "Hans" };
var equal = person.EqualsUsingComparer(person);
}
[Benchmark]
public void UsingEquals()
{
var person = new Person { Id = 1, Name = "Hans" };
var equal = person.EqualsUsingEquals(person);
}
[Benchmark]
public void UsingTuples()
{
var person = new Person { Id = 1, Name = "Hans" };
var equal = person.EqualsUsingTuples(person);
}
}
public class Program
{
public static void Main(string[] args)
{
var summary = BenchmarkRunner.Run<EqualityTests>();
}
}
}
BenchmarkDotNet=v0.11.5, OS=Windows 10.0.18362
Intel Core i7-8550U CPU 1.80GHz (Kaby Lake R), 1 CPU, 8 logical and 4 physical cores
.NET Core SDK=3.0.100-preview6-012264
  [Host]     : .NET Core 2.2.6 (CoreCLR 4.6.27817.03, CoreFX 4.6.27818.02), 64bit RyuJIT  [AttachedDebugger]
  DefaultJob : .NET Core 2.2.6 (CoreCLR 4.6.27817.03, CoreFX 4.6.27818.02), 64bit RyuJIT

Method Mean Error StdDev
UsingOperators 8.906 ns 0.2094 ns 0.1958 ns
UsingCompararer 12.043 ns 0.0670 ns 0.0523 ns
UsingEquals 9.765 ns 0.2660 ns 0.2612 ns
UsingTuples 9.186 ns 0.0994 ns 0.0930 ns
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment