Накладные расходы на итерацию преобразования T [] в IList

Я заметил снижение производительности при переборе примитивной коллекции (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();
    }
13
задан Generic Comrade 26 November 2011 в 18:06
поделиться