Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, Ikemefula, Вы писали:
I>>Именно. x[0] инлайнится враз и стоит считай бесплатно. А x.FirstOrDefault() в сравнении с этим неимоверно дорог.
I>>Например, когда эта операция одна из основных в экспоненциальном алгоритме, любая издержка дает конское отставание.
S> Я уже приводил тебе на замеры производительности. Прочитай еще раз
S>https://mattwarren.org/2016/09/29/Optimising-LINQ/
Это синтетический тест, который замеряет какой то очень крохотный кейс. Я точно так же напишу другой, вида
while(true) { yield i++}, пройдусь по ём сотню раз от нуля до миллиона и мы увидим, что в тысячу раз хуже и по памяти и процессору обычного цикла безо всяких массиво.
S> есть простейший запрос и оптимизаторы
S>S>var results = items.Where(i => i % 10 == 0)
S> .Select(i => i + 5);
S>
S> Итеративно 3 удава
S> Linq 4.88
S> Roslyn 3.87
S> LinqOptimiser 5.03
Я не сильно понимаю эти результаты. Что такое удавы и какой код получил 3 удава? Самый быстрый это 3 или 5 ?
S> То есть твои доводы про производительность yield идут лесом.
Я вижу, что здесь непойми что и не ясно, зачем вообще выделять память. Зачем делать add() если можно просто вызвать соответствующую функцию?
Память нужно выделять в том случае, если у нас есть многочисленные повторные проходы по источнику.
То есть, если ты сотню раз будешь использовать источник такого вида
while(true) {
yield i++;
}
То ты сэкономишь кучу памяти, но при этом работа с источником окажется примерно в 1000 раз медленнее.
И для оптимизации используется кеширование коллекции.