Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Кэширование лямбда-выражений C#

#c_sharp #стандарт #оптимизация #linq


Столкнулся со следующим: Написав свою функцию кэширования значений лямбда-выражений(думал
это ускорит работу программы на повторных прогонах со старыми входными данными), я
приступил к тестированию, но заметил, что даже без использования моего кэширования
программа на втором прогоне выражений затрачивает уже значительно меньше тиков процессора(примерно
вдвое меньше). Т.е. есть подозрение, что кэширование для значений лямбда-выражений
уже реализовано в C# по умолчанию, так ли это?    


Ответы

Ответ 1



Лямбда-выражение — не более чем хитро оформленный указатель на функцию, так что кешированием вы не добьётесь ощутимого выигрыша в производительности. Не пытайтесь ускорить программу, не проведя профилирование. По поводу второго прогона — думаю, вы столкнулись с JIT-компиляцией. Каждая функция (не только лямбда) при первом выполнении компилируется в нативный код. Каждое последующее выполнение уже не нуждается в компиляции, а значит, происходит значительно быстрее.

Ответ 2



К ответу @VladD о JIT-компиляции добавлю, что похожее поведение можно наблюдать не только при обращении к обычным IEnumerable (Linq to Objects), но и в случае работы с Entity Framework. Однако в этом случае дело не в JIT-компиляции (хотя и она, разумеется, никуда не девается), а в так называемых "холодных запросах", во время которых "за кулисами" выполняется множество всяческих подготовительных действий по созданию и проверке моделей для дальнейшей работы с базой. После одного холодного запроса выполняются уже "горячие", которые происходят гораздо быстрее

Комментариев нет:

Отправить комментарий