Подтвердить что ты не робот

Emit mapper vs valueinjecter или automapper performance

Я потратил некоторое время на сравнение этих трех картографов, и интересно, почему столь большой разброс производительности между emitmapper и любым из инжекторов или автоматов (последние два сопоставимы по производительности). Из контрольного теста в решении emitmapper (1000000 итераций):

    Auto Mapper (simple):        38483 milliseconds
    Emit Mapper (simple):        118 milliseconds
    Handwritten Mapper (simple): 37 milliseconds

    Auto Mapper (Nested):        53800 milliseconds
    Emit Mapper (Nested):        130 milliseconds
    Handwritten Mapper (Nested): 128 milliseconds

    Auto Mapper (Custom):        49587 milliseconds
    Emit Mapper (Custom):        231 milliseconds

Также некоторые ориентиры от инжектора-инжектора, запущенного с добавленным emitmapper (для 10000 итераций):

    Convention: 00:00:00.5016074
    Automapper: 00:00:00.1992945 
    Smart convention: 00:00:00.2132185
    Emit mapper(each time new mapper): 00:00:00.1168676
    Emit mapper(one mapper): 00:00:00.0012337

Там, где в первом испускании теста картографа, он был создан каждый раз, во втором - один картограф для всех преобразований.

Принимая это во внимание, получим результат как valueinjecter (также как automapper) медленнее, чем в 100 раз, чем испускать mapper. В чем причина столь большой разницы в производительности? Что касается меня, то объект для сопоставления объектов не может занимать много времени по сравнению с рукописным картографом, поскольку он является узким местом проекта (если нам нужно сопоставить коллекцию объектов, например).

В данный момент я думаю об использовании emit mapper, но только одна причина, по которой я не готов принять решение: emit mapper вообще не поддерживается первыми разработчиками, но я не уверен, что это очень важно ( очень низкая возможность выполнения некоторых дополнительных функций).

4b9b3361

Ответ 1

Объяснение объясняется в документации EmitMapper:

Он эффективно использует библиотеку Emit для генерации mappers во время выполнения непосредственно в IL, как если бы эти картотеки были написаны вручную. Большинство других карт используют библиотеку Reflection для сопоставления (или генерации исходного кода). Кроме того, EmitMapper минимизирует операции по боксу и распаковке и дополнительные вызовы во время сопоставления. Например, он выполняет преобразование типов для типов значений без box-unboxing и конвертирует вложенные элементы без рекурсии (однопроходный алгоритм), когда это возможно.

Отражение чрезвычайно медленное по сравнению с рукописным кодом. Вместо этого EmitMapper, по сравнению с рукописным сопоставлением, имеет только служебные служебные данные при запуске.