Я заметил хитовую производительность итерации над примитивной коллекцией (T []), которая была передана в общий набор интерфейсов (IList или IEnumberable).
Например:
private static int Sum(int[] array)
{
int sum = 0;
foreach (int i in array)
sum += i;
return sum;
}
Вышеуказанный код выполняется значительно быстрее, чем код ниже, где параметр изменяется на тип IList (или IEnumerable):
private static int Sum(IList<int> array)
{
int sum = 0;
foreach (int i in array)
sum += i;
return sum;
}
Достижение производительности все равно происходит, если переданный объект является примитивным массивом, и если я попытаюсь изменить цикл на цикл for вместо цикла foreach.
Я могу обойти хит производительности, закодировав его так:
private static int Sum(IList<int> array)
{
int sum = 0;
if( array is int[] )
foreach (int i in (int[])array)
sum += i;
else
foreach (int i in array)
sum += i;
return sum;
}
Есть ли более элегантный способ решения этой проблемы? Спасибо за ваше время.
Изменить: Мой контрольный код:
static void Main(string[] args)
{
int[] values = Enumerable.Range(0, 10000000).ToArray<int>();
Stopwatch sw = new Stopwatch();
sw.Start();
Sum(values);
//Sum((IList<int>)values);
sw.Stop();
Console.WriteLine("Elasped: {0} ms", sw.ElapsedMilliseconds);
Console.Read();
}