#c_sharp #стандарт #оптимизация #linq
Столкнулся со следующим: Написав свою функцию кэширования значений лямбда-выражений(думал это ускорит работу программы на повторных прогонах со старыми входными данными), я приступил к тестированию, но заметил, что даже без использования моего кэширования программа на втором прогоне выражений затрачивает уже значительно меньше тиков процессора(примерно вдвое меньше). Т.е. есть подозрение, что кэширование для значений лямбда-выражений уже реализовано в C# по умолчанию, так ли это?
Ответы
Ответ 1
Лямбда-выражение — не более чем хитро оформленный указатель на функцию, так что кешированием вы не добьётесь ощутимого выигрыша в производительности. Не пытайтесь ускорить программу, не проведя профилирование. По поводу второго прогона — думаю, вы столкнулись с JIT-компиляцией. Каждая функция (не только лямбда) при первом выполнении компилируется в нативный код. Каждое последующее выполнение уже не нуждается в компиляции, а значит, происходит значительно быстрее.Ответ 2
К ответу @VladD о JIT-компиляции добавлю, что похожее поведение можно наблюдать не только при обращении к обычным IEnumerable (Linq to Objects), но и в случае работы с Entity Framework. Однако в этом случае дело не в JIT-компиляции (хотя и она, разумеется, никуда не девается), а в так называемых "холодных запросах", во время которых "за кулисами" выполняется множество всяческих подготовительных действий по созданию и проверке моделей для дальнейшей работы с базой. После одного холодного запроса выполняются уже "горячие", которые происходят гораздо быстрее
Комментариев нет:
Отправить комментарий