虚方法的性能影响

6
为了适应单元测试和模拟,将方法和属性声明为虚拟方法已成为一种常见做法。相较于非虚拟方法,声明虚拟方法是否会对性能产生影响?

你认为“可测试性设计”只是将所有东西都变成虚拟的,所有类都变成开放的吗?嗯... - Stefan Hanke
@StefanHanke:我没有看到任何暗示说OP认为这只是如此。 - Jon Skeet
我其实很惊讶Moles似乎不太受欢迎。它似乎比MOQ等工具有更多的优势。在Moles中,你基本上可以模拟任何东西(甚至是私有方法)。而MOQ似乎仍然依赖于接口和虚函数。 - TGH
抱歉,moq 也使用动态代理(不要使用它)。我指的是那些通过分析器接口进行拦截的工具。 - Stefan Hanke
@TGH Moles目前似乎并没有得到充分的支持,所以它并不是很受欢迎。如果你去他们的网站看看,你会发现它最近被“关闭”了。 - Joe Phillips
显示剩余2条评论
3个回答

9

虚方法使用Callvirt Opcode调用,而非虚方法使用标准的Call Opcode。 Call Opcode比Callvirt更快,但我从未发现它足够重要,以至于需要基于这个做出设计决策。

过早优化是万恶之源。


据我所知,C#编译器将对所有实例方法使用CallVirt,无论它们是否是虚拟的。这样CLR就可以进行空值检查。 - Jon Skeet
@JohnSkeet 那么这是否意味着最终实际上没有区别? - TGH
不错的观点John - 除了值类型实例方法,我认为你是正确的 - 对于这些方法,编译器会发出Opcodes.Call。 - Jeff

1

不,不是很明显。

这不是你会注意到的东西。


1

我不知道具体情况,但我知道对于99%的应用程序来说,你不必担心它。

顺便说一下 - 如果选择模拟接口而不是类,你就不需要虚方法。

祝好运, 汤姆


使用接口和虚方法时,同样存在间接性的“惩罚”。 - leppie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接