Улучшение отражения производительности - какие альтернативы я должен рассмотреть?

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

19
задан Wai Ha Lee 29 January 2019 в 17:34
поделиться

6 ответов

Используйте Delegate.CreateDelegate , чтобы превратить MethodInfo в делегат со строгой типизацией. Это может значительно повысить производительность . У меня есть сообщение в блоге об этом с образцом кода. Обратите внимание, что это поможет только в том случае, если вам нужно установить одни и те же свойства несколько раз - в основном это означает, что большая часть проверки типов выполняется один раз при создании делегата, а не при каждом вызове.

У Марка Гравелла есть проект HyperPropertyDescriptor , который обеспечивает даже лучшую производительность, но вводит дополнительную зависимость. Этот проект стал отправной точкой для более современного Fast Member ( github ). В общем, вы должны использовать Fast Member вместо HyperProperty.

29
ответ дан 30 November 2019 в 03:25
поделиться

В .NET 4.0 (бета) это можно сделать с помощью обновленных деревьев выражений, используя Expression.Block и Expression.Assign - затем скомпилировать это в типизированный делегат; работа выполнена.

В .NET 2.0 и выше (как упоминал Джон) HyperDescriptor является разумным вариантом - он работает как пользовательская реализация PropertyDescriptor , поэтому вы просто выполняете такой код, как:

// store this collection for optimum performance
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(
    typeof(SomeType));
props["Name"].SetValue(obj, newName);
props["DateOfBirth"].SetValue(obj, newDoB);

Это все еще имеет немного бокса, но на самом деле это не узкое место.

7
ответ дан 30 November 2019 в 03:25
поделиться

Отражение может быть невероятно быстрым , если вы все сделаете правильно (не так быстро, как статический код, конечно).

Найти установщик свойств - это медленный. Вызов делегата выполняется быстро.

Вам необходимо получить и кэшировать объекты Delegate для каждого средства задания свойств для каждого типа DTO. Это медленная часть, но это одноразовый хит. Затем вы можете вызвать каждый из кэшированных делегатов для установщиков свойств данного типа DTO, передав объект DTO и новое значение свойства, но эта часть будет очень быстрой.

один раз хит. Затем вы можете вызвать каждый из кэшированных делегатов для установщиков свойств данного типа DTO, передав объект DTO и новое значение свойства, но эта часть будет очень быстрой.

один раз хит. Затем вы можете вызвать каждый из кэшированных делегатов для установщиков свойств данного типа DTO, передав объект DTO и новое значение свойства, но эта часть будет очень быстрой.

3
ответ дан 30 November 2019 в 03:25
поделиться

Уверены ли вы, что использование отражения работает слишком медленно? Хотя отражение в .NET не так быстро , как статический код, оно все же очень быстрое. Вам следует писать код как можно проще - даже если он использует отражение - и возвращаться для оптимизации только в том случае, если вы заметили проблемы с производительностью и изолировали их от использования отражения. В большинстве случаев у вас не будет никаких проблем. Отражение используется во всех видах кода, чувствительного к производительности, например в ASP.NET MVC.

0
ответ дан 30 November 2019 в 03:25
поделиться

Reflection получил плохую репутацию из Java, где он (или, по крайней мере, был) очень медленным. Это не относится к .net, поэтому я не понимаю вашего возражения против его использования. Также я согласен с Рексом, вы не можете сказать, что что-то плохо работает, не измерив его.

0
ответ дан 30 November 2019 в 03:25
поделиться

Вы можете использовать упрощенную генерацию кода. Вот несколько статей:

0
ответ дан 30 November 2019 в 03:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: