МЕТОД ОПТИМІЗАЦІЇ РЕФЛЕКСІЇ В .NET ЗА РАХУНОК ВИКОРИСТАННЯ ДИНАМІЧНОЇ КОМПІЛЯЦІЇ ЛЯМБДА ФУНКЦІЙ
DOI:
https://doi.org/10.31891/2307-5732-2024-339-4-62Ключові слова:
метапрограмування, .NET, C#, рефлексія, ExpressionАнотація
Розглянуто та проаналізовано методи оптимізації рефлексії в .NET. Основним методом оптимізації є використання динамічної компіляції лямбда функцій за рахунок використання інших методів метапрограмування. Одним із підходів, що дозволяють досягти необхідного результату, є використання компіляції Expression. Виклик скомпільованої лямбда функції є швидшим за виклик рефлексії, але сама компіляція займає певний час. Для цього необхідно зберігати делегат скомпільованої функції в пам’яті для можливості її повторного виклику. У ході експериментів визначено, що на версіях .NET7 і вище пошук в кеші та виклик такої функції сумарно займає стільки ж часу, як і виклик рефлексії. Таким чином, для покращення швидкодії методу необхідно спочатку оптимізувати структуру даних, що зберігає лямбда функції. Було використано більш ефективну з точки зору пошуку структуру даних. За результатами експериментів встановлено, що така оптимізація дозволила підвищити швидкодію методу. Нова структура даних дозволила використати реалізації хеш таблиць, оптимізованих під роботу з незмінюваними даними, що, в свою чергу, дозволило додатково підвищити швидкодію методу. Проте такий підхід є можливим для використання лише у версіях .NET8 та вище. Для оптимізації роботи методу у випадках послідовного виклику для одного й того ж типу даних було використано кешування інформації про останній тип даних, для якого використовувався метод. Проведено експерименти для визначення швидкодії розробленого методу у порівнянні з рефлексією та методами, що використовують схожий принцип. Для проведення експериментів було використано бібліотеку Benchmark.NET. За результатами експериментів встановлено, що розроблений метод має кращу швидкодію у порівнянні з рефлексією та аналогами.