C#(.NET)中的虚拟函数,引擎盖下会产生额外方法表引用的开销,也永远不会内联。
因此,我想知道在高性能场景中,不是推荐的方式,更好的是隐藏旧方法,以获得更好的性能,并实现JIT内联。
这是一个OKAY练习吗?
除了重新输入基类之外还有什么后果(顺便提一下,它可以在直接从接口派生的场景中部分地“无害”。
要点:
让我快速总结一下目前为止的评论和答案,以造福他人。
任何对文档的引用,或者“scoop'关于JIT编译器在这方面的行为将非常有用:)
答案 0 :(得分:3)
拥有虚拟方法是一项功能。它提供了额外的功能。该功能不是免费的(尽管它很便宜)。如果您不需要该功能,可以将其关闭,并可能获得一些边际性能优势;这些可能或可能不足以解决问题(您需要进行一些性能测试才能知道;当然,请注意,基准测试微观优化难以正确执行,因此请小心)。
如果您需要该功能,并希望具有多态行为,那么将其关闭确实不是一种选择。 You could attempt to write your own system of virtual methods without using the language's feature,但你的实现几乎肯定会变慢,所以我会反对它。
简而言之,如果您需要该功能,请将其打开,如果不需要,请将其关闭。几乎肯定不会基于性能考虑做出决定,而是根据您编写的代码的要求做出决定。