【发布时间】:2011-04-25 14:09:58
【问题描述】:
问题
在我的应用程序中,我创建了大量仅保存一些数据的“小”类实例。
我知道创建类(即构造函数调用)的成本很高。我的问题是:如果我让这个小类从另一个类继承,成本会更高吗?有些字段只会移动到超类,所以基本上我可以使用
注意:这个问题专门针对.NET中的性能。
问题举例情况及演示
考虑这两种情况:
1. case 只包含一个类。它是原始类:
public class ShapeWithOffset{
public double XOffset { get; private set; }
public double YOffset { get; private set; }
public IShape Shape{ get; private set; }
public ShapeWithOffset(double xOffset, double yOffset, IShape shape){
//check if arguments are correct/throw ArgumentException if not
XOffset = xOffset;
YOffset = yOffset;
Shape = shape;
}
//equality members
}
2。 case 由 2 个类组成,其中 second 从第一个继承。第二类ShapeWithHorizontalAndVerticalOffset提供与1.case中ShapeWithOffset相同的功能。
public class ShapeWithHorizontalOffset{
public double XOffset { get; private set; }
public IShape Shape { get; private set; }
public ShapeWithHorizontalOffset(double xOffset, IShape shape){
//check if arguments are correct/throw ArgumentException if not
XOffset = xOffset;
Shape = shape;
}
//equality members
}
public class ShapeWithHorizontalAndVerticalOffset : ShapeWithHorizontalOffset{
public double YOffset { get; private set; }
public ShapeWithHorizontalAndVerticalOffset(double xOffset, double yOffset,
IShape shape) : base(xOffset, shape){
//check if yOffset is correct/throw ArgumentOutOfRangeException if not
Yffset = yOffset;
}
//equality members
}
我的问题是:命令var foo = new ShapeWithOffset(20, 10, shape); 比var boo = new ShapeWithHorizontalAndVerticalOffset(20, 10, shape); 快吗?
如果我使用组合而不是继承,那将是......但是继承呢?
【问题讨论】:
-
您最多可以为每个对象实例节省一个函数调用,也就是说,如果您原谅我的表述,peanuts 在性能方面与您的可维护性和表现力相比从继承中获得。然而,您是否应该实际上在您的特定情况下使用继承是非常主观的并且有待商榷(这就是为什么这是评论而不是答案)。
-
这个问题在 SO 上出现了很多,它总是让我感到困惑。也就是说,“这里有两种编写代码的方法;哪个更快?”的问题。您已经以两种方式编写了代码; 尝试两种方式,看看哪个更快。人们似乎认为社区有一些神奇的方法可以知道两件事中哪一个更快,而无需尝试。没有这种神奇的方法。试试看,测量结果,然后你就会知道。
-
@drasto:让我这样说吧:我也不具备你想要的知识,我向你保证,我对编译器的了解比绝大多数人都多。当我需要性能问题的答案时我用两种方式编写代码并尝试一下。多年的经验告诉我,我对真正造成性能差异的猜测常常是大错特错。 经验调查没有神奇的替代品。
-
@drasto:此外,我们都不知道您所做的事情,即您认为重要的性能差异。有些人认为几纳秒的差异非常重要;有些人认为十分钟的差异无关紧要。我们谁也无法告诉您哪些绩效指标对您和您的客户很重要。
-
@drasto:我不认为这很清楚。例如考虑碱基调用是否内联的问题。可能是,可能不是,不尝试我不知道。现在考虑内联的性能成本;它删除了一个间接级别,这是一些指令,这是更多的时间。它增加了调用站点的代码大小,这可能会改变内存中代码的布局,这可能会导致额外的缓存未命中。现在,您已经用一纳秒换取了潜在的多微秒失误!不尝试怎么知道是不是这样?
标签: c# .net performance inheritance constructor