Ускорение словарей на базе Enum с помощью обобщенного EnumComparer - Использование кода
ОГЛАВЛЕНИЕ
Использование кода
Чтобы использовать EnumComparer, надо передать его в Dictionary:
var comparer = EnumComparer<DayOfWeek>.Instance;
var dictionary = new Dictionary<DayOfWeek, int>(comparer);
Контрольный тест
Статья была бы неполной без чисел, не так ли?
Были протестированы обе реализации EnumComparer по сравнению с рукописным компаратором, стандартным компаратором и словарем из int. Был выполнен 1.000.000 итераций над словарем dictionary, и результаты были обещающими:
Оба обобщенных EnumComparer почти не хуже рукописного компаратора! И версия дерева выражений не только понятней, но даже быстрее версии LCG version.
Остается вопрос, почему она быстрее. Деревья выражений используют LCG для компиляций. Поэтому неясно, как она генерирует более быстрый код.
Как насчет издержек генерации кода на начальном этапе сборки? Давайте посмотрим:
Обе версии гораздо медленнее собираются, чем рукописный компаратор (конструкция простого класса). Поэтому используйте данное решение, только если предстоит делать много сравнений (десятки тысяч).
(Замечание: Первые тесты показали, что обобщенный EnumComparer был чуть быстрее рукописного. Однако в повторных тестах рукописный компаратор оказался быстрее. Неизвестно, почему результаты изменились, но сейчас вложенный файл содержит весь код тестирования, и вы можете провести тест сами.)
Пример проекта
Решение содержит 3 проекта:
1. Показанный здесь код
2. Блочные тесты
3. Контрольные тесты