Я заметил снижение производительности при переборе примитивной коллекции (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();
}