C
C# Heppard
@csharp_gepard1.7K подп.
2.6Kпросмотров
25 ноября 2025 г.
Score: 2.8K
FastEnum #скорость Иногда нам нужно не просто быстро, а очень быстро. В этот момент в дело вступают самые необычные оптимизации. Например, оптимизация работы с enum. Типичный сценарий - получить строку из enum'a или, наоборот, enum из строки. Многие знают, что получение строкового представления enum'a лучше делать через Enum.GetName(MyEnum.Value), а вариант MyEnum.Value.ToString() аллоцирует новую строку и несколько медленнее. В случае сложной логики получения строкового представления enum'a, чаще всего используется кэш (который, кстати, есть в Enum.GetName). Для этой цели можно написать свой класс, который содержит два словаря. В случае получения строки из enum'a мы идём по одному словарю, а в случае получения enum'a из строки - по другому. Код примерно такой: private static readonly FrozenDictionary<string, T> StringToValues; private static readonly FrozenDictionary<T, string> ValuesToString; static EnumUtils() { var enums = Enum.GetValues<T>(); StringToValues = enums.ToFrozenDictionary(...); ValuesToString = enums.ToFrozenDictionary(); } public static string ToString(T value) { return ValuesToString.TryGetValue(value, out var stringValue) ? stringValue : Throw<string>(&#036;"Value '{value}' is not defined"); } Конечно, никакого ноу-хау тут нет, и для таких оптимизаций уже существует несколько готовых библиотек. Одна из них - FastEnum. Она показывает значительный прирост скорости не только по сравнению с обычными способами работы с enum в .NET (почти в два раза), но и по сравнению с другими подобными библиотеками: от Эндрю Лока и Enums.NET. FastEnum и библиотека от Эндрю Лока используют source generators. Мне не очень нравится тащить в код лишние зависимости, поэтому, чаще всего, я использую самописный кэш для ускорения работы с enum. Тем более, в нём можно сделать дополнительную логику, специфичную для конкретного проекта. И, в любом случае, я рекомендую присмотреться к этим библиотекам. Они маленькие и понятные, а подходы, которые там используются, могут пригодиться в повседневной работе. Картинка бенчмарка тут. Сам бенчмарк тут.
2.6K
просмотров
2130
символов
Нет
эмодзи
Нет
медиа

Другие посты @csharp_gepard

Все посты канала →
FastEnum #скорость Иногда нам нужно не просто быстро, а очен — @csharp_gepard | PostSniper