Re[38]: Есть ли подобие LINQ на других языках/платформах?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 23.04.21 09:38
Оценка:
Здравствуйте, 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 раз медленнее.
И для оптимизации используется кеширование коллекции.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.