Эксплуатационные затраты на использование динамической типизации в .NET. - программирование

Эксплуатационные затраты на использование динамической типизации в .NET.

Какова стоимость выполнения использования dynamic vs object в .NET? Скажем, например, у меня есть метод, который принимает параметр любого типа. Например.

public void Foo(object obj)
{
}

или

public void Foo(dynamic obj)
{
}

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

4b9b3361

Ответ 1

Это будет сильно зависеть от точного сценария, но есть встроенный слой кэширования, поэтому он не так страшен, как вы могли ожидать (он не делает отражения каждый раз). Он также может варьироваться в зависимости от операций (например, "снятые" операции NULL-T заметно медленнее). Вам нужно будет измерить, но, как это бывает, у меня есть некоторые тайминги для доступа к члену (собственности), которые я использовал при выполнении FastMember:

Static C#: 14ms
Dynamic C#: 268ms
PropertyInfo: 8879ms (aka reflection)
PropertyDescriptor: 12847ms (aka data-binding)
TypeAccessor.Create: 73ms (aka FastMember)
ObjectAccessor.Create: 92ms (aka FastMember)

CAVEAT: это для одного теста, который может не соответствовать вашему сценарию. Этот код показан здесь

Итак: на основе простого теста, примерно в 20 раз медленнее, чем статический регулярный С#, но примерно в 30 раз быстрее, чем отражение.

UPDATE: интересно, похоже, что в .NET 4.5 ускорилось отражение:

Static C#: 13ms
Dynamic C#: 249ms
PropertyInfo: 2991ms
PropertyDescriptor: 6761ms
TypeAccessor.Create: 77ms
ObjectAccessor.Create: 94ms

Здесь он примерно в 12 раз быстрее, чем отражение, потому что отражение стало быстрее (не потому, что динамика стала медленнее).

Ответ 2

Поэтому я хочу знать, рекомендуется ли использовать динамический вместо объекта и на каком уровне это использование происходит за счет производительности?

Если вам не нужна динамическая типизация, не используйте ее.

Если вам нужна динамическая типизация - если она позволяет избежать некоторого сложного кода отражения, например, - затем используйте его и измерьте стоимость выполнения.

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