Циклическое повторение через SortedList - Почему это быстрее?

Весь смысл интерфейсов должен дать Вам гибкость для имения класса быть вынужденным реализовать несколько интерфейсов, но все еще не позволить множественное наследование. Проблемы с наследованием от нескольких классов - многие и варьировались и Википедия , страница на нем подводит итог их вполне прилично.

Интерфейсы являются компромиссом. Большинство проблем со множественным наследованием не относится к абстрактным базовым классам, таким образом, наиболее современные языки в эти дни отключают множественное наследование, все же называют интерфейсы абстрактных базовых классов, и позволяет классу "реализовывать" столько из тех, сколько они хотят.

5
задан Brian Webster 8 June 2011 в 20:33
поделиться

4 ответа

SortedList расширяет коллекцию, реализуя IComparer для обеспечения функции сортировки. Внутри он реализует 2 массива для хранения элементов списка - один массив для ключа и один для значений. .NET Array оптимизирован для быстрого упорядоченного и быстрого произвольного доступа.

Я подозреваю, что первые 2 медленные, потому что оператор foreach в SortedList является оболочкой вокруг Enumerator. Вызов foreach запросит перечислитель, вызовет MoveNext и Current. Кроме того, просмотр общего списка может потенциально включать упаковку и распаковку при перемещении по списку, а также может создавать накладные расходы на производительность, которые обычно не возникают при доступе по индексу.

4
ответ дан 13 December 2019 в 05:37
поделиться

Я думаю, что компилятор может лучше оптимизировать блок 3 из-за фиксированного диапазона цикла. В блоках 1 и 2 компилятор не будет знать, каков верхний предел цикла, пока он не оценит список, что замедлит его работу.

3
ответ дан 13 December 2019 в 05:37
поделиться

Типы значений хранят фактические данные, а ссылочные типы хранят ссылки на данные. Типы ссылок динамически хранятся в куче, а типы значений - в стеке.

Типы значений: http://msdn.microsoft.com/en-us/library/s1ax56ch.aspx

Когда начинается выполнение цикла For Each ... Next, Visual Basic проверяет, что группа ссылается на допустимый объект коллекции. Если нет, генерируется исключение. В противном случае он вызывает метод MoveNext и свойство Current объекта перечислителя, чтобы вернуть первый элемент. Если MoveNext указывает, что следующего элемента нет, то есть если коллекция пуста, то цикл For Each завершается, и управление передается оператору, следующему за оператором Next. В противном случае Visual Basic устанавливает element для первого элемента и запускает блок операторов.

В целом это звучит так, как будто For Each более «управляемый» и выполняет много накладных расходов, чтобы убедиться, что все соответствует. В результате он медленнее.

Если нет, генерируется исключение. В противном случае он вызывает метод MoveNext и свойство Current объекта перечислителя, чтобы вернуть первый элемент. Если MoveNext указывает, что следующего элемента нет, то есть если коллекция пуста, то цикл For Each завершается, и управление передается оператору, следующему за оператором Next. В противном случае Visual Basic устанавливает element для первого элемента и запускает блок операторов.

В целом это звучит так, как будто For Each более «управляемый» и выполняет много накладных расходов, чтобы убедиться, что все соответствует. В результате он медленнее.

Если нет, генерируется исключение. В противном случае он вызывает метод MoveNext и свойство Current объекта перечислителя, чтобы вернуть первый элемент. Если MoveNext указывает, что следующего элемента нет, то есть если коллекция пуста, то цикл For Each завершается, и управление передается оператору, следующему за оператором Next. В противном случае Visual Basic устанавливает element для первого элемента и запускает блок операторов.

В целом это звучит так, как будто For Each более «управляемый» и выполняет много накладных расходов, чтобы убедиться, что все соответствует. В результате он медленнее.

затем цикл For Each завершается, и управление передается оператору, следующему за оператором Next. В противном случае Visual Basic устанавливает element для первого элемента и запускает блок операторов.

В целом это звучит так, как будто For Each более «управляемый» и выполняет много накладных расходов, чтобы убедиться, что все соответствует. В результате он медленнее.

затем цикл For Each завершается, и управление передается оператору, следующему за оператором Next. В противном случае Visual Basic устанавливает element для первого элемента и запускает блок операторов.

В целом это звучит так, как будто For Each более «управляемый» и выполняет много накладных расходов, чтобы убедиться, что все соответствует. В результате он медленнее.

3
ответ дан 13 December 2019 в 05:37
поделиться

Моя случайная догадка: List1 содержит ~ 750 элементов (а не только 250). Ваш третий случай выполняется быстрее, потому что он не выполняет итерацию по каждому элементу, который имеет List1.

2
ответ дан 13 December 2019 в 05:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: