【问题标题】:Performance considerations of inheritance in C#C#中继承的性能注意事项
【发布时间】:2011-05-06 05:51:49
【问题描述】:

如果我使用public int I;(或任何其他字段)创建一个类与创建一个从具有public int I; 的基类继承的类,编译器是否会产生相同的IL?

无论哪种方式,结果类的行为都相同,但编译器的行为是否相同?

也就是说,编译器只是将代码从基类复制粘贴到派生类中,还是在继承时实际上创建了两个不同的类对象?

class A
{
    public int I;
}

class B : A
{
}

现在以下两个 DoSomething() 调用之间是否存在性能差异?

var a = new A();
var b = new B();
DoSomething(a.I);
DoSomething(b.I); // Is this line slower than the above line due to inheritance?

尝试忽略编译器可能针对这种特殊情况所做的任何优化。我的问题是关于 C# 中的继承通常是否具有相关的性能损失。大部分时间我不在乎,但有时我想优化一段高频代码。

【问题讨论】:

  • 听起来您正在尝试进行过早的优化?
  • 看起来您可以轻松地对自己进行基准测试。你为什么不呢?
  • jgauffin: 阅读我问题的最后一句话 :)
  • Oded:几个原因:这样的基准测试容易出错,现在正在观看 SO 问题的人可能知道他们头顶的答案,共享此信息以便于搜索是SE站点的点,我还不知道如何看待C# IL。
  • +1 有趣的问题。在这里提出了类似但不相同的问题 - stackoverflow.com/questions/930418/…

标签: c# performance inheritance


【解决方案1】:

编译器发出的内容是相同的;事实上,即使在密封类上调用非虚拟实例方法时,它也会使用Callvirt - 这与调用任何具有多态性的方法相同。

不:它不是复制/粘贴 - 您在 A 中编写的代码仍然是 A 的一部分。不,你不会因为继承而得到 2 个对象。它正在结合行为B 的一个实例也有来自 A 的实现 - 但不是通过复制粘贴:B 也是一个@ 987654327@ - 即Dog 也是Mammal,等等。

【讨论】:

  • 等等,所以要明确一点:如果我从基类继承方法,而不是在不从任何类继承的密封类上调用方法,这些方法调用的性能也会一样吗?
  • @Olhovsky 以最可衡量的方式,是的;内联可能有一些微妙之处,但没有什么值得兴奋的。哦,还有“不从任何类继承”- 任何类都继承自 object 这是一个类。
猜你喜欢
  • 2011-07-09
  • 2017-01-24
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 2020-06-28
  • 1970-01-01
相关资源
最近更新 更多