Как это использование AutoMapper (через статический метод Mapper.Map) влияет на производительность, и есть ли лучший способ сделать это?
Правильно ли вы используете AutoMapper.Инициализация при запуске приложения - это лучшая практика.Вызывая Mapper.Initialize
, вы инициализируете маппер, который является статическим экземпляром интерфейса IMapper
(доступ через статическое свойство Mapper.Instance
).При использовании статических членов класса Mapper
вы имеете дело с Mapper.Instance
, и это один и тот же экземпляр для всех объектов в одном и том же AppDomain
.Вы не будете влиять на производительность до тех пор, пока вы используете один и тот же AppDomain
и не занимает много времени в вашей конфигурации сопоставления (кто-то может поместить некоторую бизнес-логику или отнимающую много времени логику в AfterMap
, BeforeMap
, ResolveUsing
, MapFrom
и т. Д.).
Что если я получу 100 запросов в секунду на различные действия контроллера;Насколько я знаю, каждый запрос будет иметь отдельный поток, но будет иметь доступ к той же памяти для метода Mapper.Map (если я правильно).Что, насколько мне известно, означает, что на производительность будет оказано серьезное влияние.
Ваше приложение использует один экземпляр AppDomain
, каждый запрос получит новый поток, но этот поток будет выполняться в том же AppDomain
это запустило ваше приложение, которое выполнило метод Application_Start
, и, наконец, вы получите тот же экземпляр Mapper.Instance
, поэтому план вашей конфигурации будет скомпилирован и кэширован только при поступлении первого запроса.Будет затронут только первый запрос, а не следующий.Другие запросы будут использовать план конфигурации из кэша.Так что никакого влияния на производительность не будет, если вы находитесь в том же AppDomain
и не используете трудоемкую логику в пользовательской альтернативе сопоставления, которую позволяет AutoMapper.
Кроме того, AutoMapper поставляется с некоторыми конфигурациями, которые можно активировать или деактивировать и повысить производительность.
Явная компиляция
Как я уже говорил, первый запрос, использующий отображение, скомпилирует вашплан конфигурации.Как говорится в документации AutoMapper :
Поскольку компиляция выражений может быть немного ресурсоемкой, AutoMapper лениво компилирует планы карты типов на первой карте.Однако такое поведение не всегда желательно, поэтому вы можете указать AutoMapper скомпилировать его сопоставления напрямую.Для нескольких сотен сопоставлений это может занять пару секунд.
Вы можете явно составить план, выполнив это сразу после настройки сопоставления:
Mapper.Configuration.CompileMappings();
Я использую этои объединить его с «прогревом» приложения, когда мое приложение запускается автоматически вместо ожидания первого запроса на сопоставление и компилирует план моей конфигурации.Вы можете посмотреть этот ответ о том, как включить эту функцию.
Встроенное отображение
С 6.2.0 AutoMapper поставляется с новой функцией, которая называется встроенное отображение , которое позволяет создавать карту типов на лету, а не настраивать их с помощью метода Mapper.Initialize
.Поскольку встроенное отображение создается на лету, поэтому они компилируются в это время, поэтому выигрыш, который вы ищете в явном виде при составлении плана, не очень помогает.Итак, что я делаю в своих проектах, я деактивирую эту функцию, чтобы никто не мог ею воспользоваться.Чтобы отключить его, вы делаете это:
cfg.CreateMissingTypeMaps = false;
Редактировать 26/02/2019
Создатель AutoMapper только что добавил запись в блоге сегодня (26/02/2019) о Правила использования AutoMapper .Необходимо прочитать.