System.Reflection vs Generics - 性能

Adm*_*vić 6 c# generics reflection

我即将在服务器应用程序上编写一组方法,这些方法接收从TCP套接字接收的消息,对它们进行编码/解码,并加密/解密它们.

考虑消息被定义为特殊类型,每个都有自己的属性和总长度,我需要选择以下解决方案之一:1.制作使用泛型的方法,例如Encode<T>(...) where T : IMessage然后为每种类型的实现编码器/解码器消息,并有ResolveEncoder<T>将挑选编码器被通缉的消息或2.使用任何类型的消息的制作方法,只要它实现IMessage,比如Encode(IMessage message),用的System.Reflection决定一切,我需要了解它.

我对解决方案#2更感兴趣,因为它使我的代码缩小了30倍.但是,我担心不断反映属性是否会影响性能.现在由于时间限制完成项目,我无法真正"实验".

我将非常感谢任何个人经验或与基准测试相关的性能与任何一种解决方案的关系.

jas*_*son 6

现在由于时间限制完成项目,我无法真正"实验".

那么你的真正约束不是性能,而是你可以在给定的时间约束中编码和测试和调试.假设你声称反射版本小30倍,听起来就像你应该倾向于那样.

但是,有五点:

  1. 我怀疑30x是正确的估计,它可能要小得多.
  2. 反射的效果不如使用泛型.毫无疑问.
  3. "但是,我担心是否会不断反映房产的性能." 您可以通过积极缓存PropertyInfos以及不是通过反射加载的内容来减轻其中的一部分.
  4. 你可以使用表达式树做类似于反射的事情,你会看到这样做会带来显着的性能提升.这是一篇博客文章,将在这个问题上引导您朝着正确的方向前进.但是,如果您还不熟悉使用表达式树,考虑到时间限制,使用您不熟悉的概念进行编码,测试和调试是一种风险.
  5. 你确定这甚至是性能瓶颈吗?如果网络延迟在这里占主导地位并且你过早地进行优化,那就不会让我感到震惊.

  • 是的,你对表达树的错误.看,如果网络延迟是我在答案中已经说过的瓶颈,那么我不确定为什么你会因为真正的约束是项目截止日期而失去睡眠.以您知道如何并且可以满足截止日期的方式对其进行编码.如果性能无关紧要,因为这不是瓶颈,为什么还要担心性能呢?**此外,无论如何,你永远不应该猜测是否在进行表演.** (2认同)

Ase*_*tam 4

反射可以足够快。但需要正确执行。

反射性能 -

快速、轻便的功能

typeof
Object.GetType
typeof == Object.GetType
Type equivalence APIs (including typehandle operator overloads)
get_Module
get_MemberType
Some of the IsXX predicate APIs
New token/handle resolution APIs in the .NET Framework 2.0
Run Code Online (Sandbox Code Playgroud)

昂贵的功能

GetXX  APIs (MethodInfo, PropertyInfo, FieldInfo, and so on)
GetCustomAttributes
Type.InvokeMember
Invoke APIs (MethodInfo.Invoke, FieldInfo.GetValue, and so on)
get_Name (Name property)
Activator.CreateInstance
Run Code Online (Sandbox Code Playgroud)

来源 - 避免常见的性能缺陷以构建快速的应用程序

MethodInfo 可以加速 -提高性能反射,我应该考虑哪些替代方案

好的链接:
.NET 反射的成本有多高?
http://www.codeproject.com/Articles/18450/HyperDescriptor-Accelerated-dynamic-property-acces