'新'而不是虚拟+覆盖黑客的高性能和内联

时间:2014-04-17 14:37:50

标签: c# performance function override

C#(.NET)中的虚拟函数,引擎盖下会产生额外方法表引用的开销,也永远不会内联。

因此,我想知道在高性能场景中,不是推荐的方式,更好的是隐藏旧方法,以获得更好的性能,并实现JIT内联。

这是一个OKAY练习吗?

除了重新输入基类之外还有什么后果(顺便提一下,它可以在直接从接口派生的场景中部分地“无害”。

要点:

让我快速总结一下目前为止的评论和答案,以造福他人。

  1. 它几乎不是一个好主意,会影响多态性和可读性。
  2. 在我的测试中,内联确实在某些情况下提供了显着的差异。
  3. 需要进行研究: JIT编译器可能会内联这些虚拟方法。 (可能只在密封的课程下)。
  4. 任何对文档的引用,或者“scoop'关于JIT编译器在这方面的行为将非常有用:)

1 个答案:

答案 0 :(得分:3)

拥有虚拟方法是一项功能。它提供了额外的功能。该功能不是免费的(尽管它很便宜)。如果您不需要该功能,可以将其关闭,并可能获得一些边际性能优势;这些可能或可能不足以解决问题(您需要进行一些性能测试才能知道;当然,请注意,基准测试微观优化难以正确执行,因此请小心)。

如果您需要该功能,并希望具有多态行为,那么将其关闭确实不是一种选择。 You could attempt to write your own system of virtual methods without using the language's feature,但你的实现几乎肯定会变慢,所以我会反对它。

简而言之,如果您需要该功能,请将其打开,如果不需要,请将其关闭。几乎肯定不会基于性能考虑做出决定,而是根据您编写的代码的要求做出决定。