Methods found in System.Linq usually have worse performance on arrays than custom imperative algorithms. I tested the performance of SequenceEqual.
using System;
using System.Diagnostics;
using System.Linq;
class Program
{
static void Main()
{
const int max = 10000;
var a1 = Enumerable.Range(0, short.MaxValue).ToArray();
var a2 = Enumerable.Range(0, short.MaxValue).ToArray();
var s1 = Stopwatch.StartNew();
// Version 1: use SequenceEqual.
for (int i = 0; i < max; i++)
{
bool equals = a1.SequenceEqual(a2);
}
s1.Stop();
var s2 = Stopwatch.StartNew();
// Version 2: use custom method.
for (int i = 0; i < max; i++)
{
bool equals = ArraysEqual(a1, a2);
}
s2.Stop();
Console.WriteLine(((double)(s1.Elapsed.TotalMilliseconds * 1000000) / max).ToString(
"0.00 ns"));
Console.WriteLine(((double)(s2.Elapsed.TotalMilliseconds * 1000000) / max).ToString(
"0.00 ns"));
}
static bool ArraysEqual(int[] a1, int[] a2)
{
if (a1.Length == a2.Length)
{
for (int i = 0; i < a1.Length; i++)
{
if (a1[i] != a2[i])
{
return false;
}
}
return true;
}
return false;
}
}
515889.45 ns
36280.79 ns