Код: Выделить всё
public T? Find(Predicate match) {
if (match == null) {
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
}
for (int i = 0; i < _size; i++) {
if (match(_items[i])) {
return _items[i];
}
}
return default;
}
Ассемблерный код настолько похож отчасти из-за исключения
проверок границ. Но также важным является то, что JIT распознает индексатор span
как встроенный, что означает, что JIT генерирует специальный код
для индексатора, а не транслирует его фактический IL-код в
ассемблер.
Все это иллюстрирует, что среда выполнения может применять к интервалам
те же виды оптимизации, что и к массивам, делая интервалы
эффективный механизм доступа к данным.
Когда стало очевидно, что итерация по Span массива будет такой же быстрой, а может быть, и быстрее, чем просто итерация на самом массиве? В какой версии .NET были представлены эти оптимизации JIT Span, которые нельзя было использовать для массивов?
Подробнее здесь: https://stackoverflow.com/questions/789 ... g-on-the-a