虚拟与接口poco,什么更快?

时间:2009-08-14 20:16:26

标签: interface virtual poco inlining

我正在维护一个设计如下的应用程序:

messy code --abuses--> simplePoco (POCO data capsule)

数据封套是一个包含大量getter和setter(属性)的简单类。它使用DI框架并始终使用IoC容器提供数据封包的实例(幸运的是我!)。

问题是,我需要在simplePoco

中引入“更改通知”机制
messy code --abuses--> simplePoco 
               |
               V
         changes logger,
         status monitor
     (I wanna know about changes)

我有几个选择:

  • 介绍IPoco并修改凌乱的代码,以便我可以simplePoco获取速度,或notifyingPoco当我想要更改通知时(选择性地慢)?或者......

  • 将所有内容虚拟化并在notifyingPoco之上滚动我自己的自定义simplePoco课程(甚至更慢)?

  • 我不知道的设计模式?

它是一个客户端/服务器系统,但我只是修改服务器部分,所以如果可能的话,我宁愿触摸凌乱的代码或客户端代码(有序列化器和反射和可怕的忍者的东西...)不要意外地破坏任何东西。

使用接口会阻止JIT内联对getter / setter的调用吗?

考虑到simplePoco实例被严重滥用,最好的方法是什么?

1 个答案:

答案 0 :(得分:3)

任何类型的虚拟调用(无论是在接口上还是直接在类上 - 所有接口调用都是虚拟的!)都不会被CLR JIT内联。也就是说,接口调用稍微慢一点,因为它们必须总是通过潜在的远程/代理路径,并且因为它们必须将this - 指针移动到类的开头,然后才能进入函数体。直接在类成员上进行的虚拟调用永远不必进行移位,除非该类派生自MarshalByRefObject,否则不要进行代理检查。

尽管如此,这两者之间的性能差异非常小,所以您应该忽略它们,并专注于设计的清洁度和易于实现。