Как вы оптимизируете производительность получения / установки атрибута украшенных свойств? - PullRequest
3 голосов
/ 05 января 2009

В C # я отмечаю свойства некоторых классов атрибутами, и я использую отражение, чтобы найти эти свойства, чтобы выполнить операции получения и установки на них. Однако я обнаружил, что получение / установка с отражением таким образом примерно в 10 раз медленнее, чем POCO получает / устанавливает. Помимо отказа от базового сценария, описанного выше, для использования альтернативных методов, есть ли документированные приемы, позволяющие значительно повысить производительность, такие как методы кэширования?

Ответы [ 2 ]

7 голосов
/ 05 января 2009

Выходя за рамки сказанного casperOne (включая информацию о проверке того, что это узкое место), вы можете найти очень полезным для преобразования методов получения / установки в делегаты (Func<T> и Action<T> для получателя и установщика соответственно), используя Delegate.CreateDelegate . Это может иметь огромное значение, и это не очень сложно. Если вы уже собираетесь кэшировать PropertyInfo, просто кэшируйте пару делегатов.

У меня есть сообщение в блоге о Delegate.CreateDelegate - я впервые использовал его в гневе при портировании протокольных буферов (которые иногда могут быть слишком интенсивными). Это очень помогло в этом случае.

3 голосов
/ 05 января 2009

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

Если вы не делаете глупостей для кэширования значения (например, помещаете все экземпляры PropertyInfo в один длинный список и повторяете список каждый раз, чтобы найти его), все будет в порядке.

Конечно, прежде чем идти по этому пути, убедитесь, что вы не страдаете от преждевременной оптимизации болезни. Определите, что постоянный вызов GetProperty / GetProperties для вашего экземпляра Type является узким местом в вашем приложении перед внесением изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...