Рассказ о том, почему я как разработчик не использую встроенный класс Enum в .NET и вам не стоит. Внедрение лучшей альтернативы.

Для разработчика важной задачей часто является сокращение продолжительности методов на несколько милли-, микро- или даже наносекунд.
При работе с перечислениями мы часто сталкиваемся с такими задачами, как запись переменных перечисления в сообщение журнала (преобразование в строку), выполнение проверки типа или их синтаксический анализ из строки. Многие люди не думают, насколько трудоемкой может быть 1-1 такая операция, особенно с перечислениями из сотен или тысяч элементов. Эта проблема обнаружена и, к счастью, есть решения.

Существует несколько инструментов для решения этой проблемы. Когда я начал их использовать, моим фаворитом был FastEnum, которым я до сих пор пользовался чаще всего. Проверив прирост производительности, которого мне удалось добиться с помощью этой библиотеки, я был удивлен. В следующей части будет рассмотрено некоторое сравнение и тестирование нескольких операций из собственного класса Enum и утилит, предоставляемых FastEnum, поэтому вы можете понять, почему я решил отказаться от традиционных методов из класса Enum.

Если вам просто интересны результаты без подробностей бенчмаркинга и вы хотите узнать, во сколько раз быстрее представленная библиотека, перейдите к части «Заключение».

Жим

Для сравнения я создал консольное приложение .NET. После инициализации он добавил два пакета nuGet:

  • FastEnum - v1.7.0
  • Бенчмаркдотнет — v0.13.1

Исходный код вы можете найти здесь.

Структура проекта:

Color.cs — перечисление, которое будет использоваться во время бенчмаркинга, оно содержит все элементы (174 элемента) из перечисления KnownColor в System.Drawing.

Benchmarks.cs — этот класс содержит методы, которые мы будем тестировать. Есть три типа действий, которые охватит жим лежа:

  • Преобразовать элемент перечисления в строку
  • Проверьте, определен ли элемент перечисления
  • Проверьте, можно ли разобрать строку в элемент перечисления

Первые три метода проверяют встроенные методы класса Enum, вторые три проверяют альтернативные методы, предоставляемые классом FastEnum.

Program.cs — предоставляет точку входа для проекта.

Запуск нашей программы:

После настройки программы мы можем запустить программу в режиме релиза (это важно, потому что в режиме отладки она не будет работать).

Заключение

Как мы видим на изображении, между встроенными и альтернативными методами существует огромная разница. В отличие от исходного процесса, выделения памяти больше нет.

Окончательные результаты (с FastEnum):

  • Преобразование из элемента Enum в строку: 2250,4x быстрее, чем встроенное
  • Проверьте, определен ли элемент перечисления: 246,25x быстрее, чем встроенный
  • Проверить, поддается ли синтаксическому анализу строка элемента перечисления: в 11,17 раз быстрее, чем встроенный

Из этих цифр видно, что производительность значительно увеличилась. Конечно, перечисление в бенчмарке относительно невелико (174 элемента), количество вызовов было небольшим, а время действия методов все еще очень небольшим. Но если небольшой проект, подобный этому, может обеспечить такой рост производительности, представьте, что это может сделать для более крупного проекта.

Привет, ребята, меня зовут Роланд, и я здесь, чтобы поделиться со всеми вами своей страстью к разработке, компьютерной инженерии, управлению проектами, личному развитию, хобби и всему, что между ними.

Не стесняйтесь обращаться ко мне в любое время — я буду рада обменяться новыми идеями и вдохновить друг друга!