Я провел несколько тестов, используя Any
, Contains
, All
и SequenceEqual
, затем я выбрал лучший 3.
Существуют разные результаты для разных входов ...
Два идентичных массива размера 100: SequenceEqual
был быстрее
[ SequenceEqual: 00:00:00.027 ]*
[ ContainsEqSeq: 00:00:00.046 ]
[ Parallel: 00:00:00.281 ]
Два идентичных массива размера 1000: SequenceEqual
был быстрее
[ SequenceEqual: 00:00:00.240 ]*
[ ContainsEqSeq: 00:00:00.361 ]
[ Parallel: 00:00:00.491 ]
Два идентичных массива размером 10000: Parallel
был быстрее
[ SequenceEqual: 00:00:02.357 ]
[ ContainsEqSeq: 00:00:03.341 ]
[ Parallel: 00:00:01.688 ]*
Два идентичных массива размером 50000: Parallel
Ударная задница
[ SequenceEqual: 00:00:11.824 ]
[ ContainsEqSeq: 00:00:17.206 ]
[ Parallel: 00:00:06.811 ]*
Два массива с одним отличием в позиции 200: SequenceEqual
был быстрее
[ SequenceEqual: 00:00:00.050 ]*
[ ContainsEqSeq: 00:00:00.075 ]
[ Parallel: 00:00:00.332 ]
Два массива с одним отличием в позиции 0: ContainsEqSeq
и SequenceEqual
были быстрее
[ SequenceEqual: 00:00:00.002 ]*
[ ContainsEqSeq: 00:00:00.001 ]*
[ Parallel: 00:00:00.211 ]
Два массива с одним отличием в позиции 999: SequenceEqual
был быстрее
[ SequenceEqual: 00:00:00.237 ]*
[ ContainsEqSeq: 00:00:00.330 ]
[ Parallel: 00:00:00.691 ]
Два массива с одним отличием в позиции 9999: Parallel
Удар в зад
[ SequenceEqual: 00:00:02.386 ]
[ ContainsEqSeq: 00:00:03.417 ]
[ Parallel: 00:00:01.614 ]*
Код SequenceEqual
-
a1.SequenceEqual(a2)
Код для ContainsEqSeq
- ваш метод.
Код Parallel
-
bool a1IsNullOrEmpty = ReferenceEquals(a1, null) || a1.Length == 0;
bool a2IsNullOrEmpty = ReferenceEquals(a2, null) || a2.Length == 0;
if (a1IsNullOrEmpty) return a2IsNullOrEmpty;
if (a2IsNullOrEmpty || a1.Length != a2.Length) return false;
var areEqual = true;
Parallel.ForEach(a1,
(i, s, x) =>
{
if (a1[x] != a2[x])
{
areEqual = false;
s.Stop();
}
});
return areEqual;
Я бы сказал, что лучший вариант зависит от того, что вы будете вводить.
Если вы будете работать с огромными массивами (например, 10000+), я бы сказал, Parallel
- лучший выбор, он проигрывает только тогда, когда есть разница в начале.
Для других случаев SequenceEqual
может быть лучшим, я тестировал только с int[]
, но я считаю, что он может быть быстрым и для сложных типов.
Но помните, результаты будут отличаться в зависимости от ввода.