Производительность: List.Count или проверка сохраненной переменной

Интересно, имеет ли это значение:

 for (int i = 0; i < values.Count; i++)
        {
            //
        }

против

int num = values.Count;

for(int=0; i<num; i++)
{

}

Я думаю, что второй подход лучше, потому что вам не нужно считать все элементы на каждой итерации. Но я могу ошибаться. Может ли кто-нибудь осветить меня?

Ответ 1

Список уже сохраняет свой Count внутри. Сравнение, которое вы делаете, связано с стилем кода, а не с производительностью. Поскольку компилятор оптимизирует поиск "Count"

Ответ 2

Хорошо, вы можете посмотреть исходный код .NET здесь http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs#aa7e01fcb80a917e

  public int Count {
        get {
            Contract.Ensures(Contract.Result<int>() >= 0);
            return _size; 
        }
    }

Казалось бы, свойство .Count в списке выполняет быструю внутреннюю проверку, а затем возвращает _size. Таким образом, это должно быть очень близко к производительности, которую вы сами сохраняете.

Ответ 3

Это полностью зависит от того, что values. Count может быть реализовано совершенно по-разному, в зависимости от типа этого объекта.

Если вы говорите об общем List<T> - то граф реализуется как внутреннее свойство, которое не переоценивается - и, следовательно, лучший выбор.