我有一个辅助方法,需要一个开始日期和结束日期,并通过一定的业务逻辑产生一个整数结果。 这个辅助方法有时被称为超过10,000次为一组给定的数据(虽然这并不经常发生)。
问:只考虑性能,是它更有效地使这个helper方法作为一个静态方法来一些辅助类,还是会更占便宜有辅助方法作为公共方法的类?
静态方法例如:
// an iterative loop
foreach (var result in results) {
int daysInQueue = HelperClass.CalcDaysInQueue(dtBegin, dtEnd);
}
公共成员方法例如:
// an iterative loop
HelperClass hc = new HelperClass();
foreach (var result in results) {
int daysInQueue = hc.CalcDaysInQueue(dtBegin, dtEnd);
}
先谢谢您的帮助!
当你调用一个实例方法,编译器总是无形中传递一个额外的参数,可根据该方法内this
名字。 static
方法不叫代表任何对象,因此他们没有this
的参考。
我看到标记实用方法,为一些好处static
:
小 的性能提升,你不支付的参考this
,你真的不使用。 不过,我怀疑你永远不会看到的差异。
方便 -您可以调用static
方法无论何时何地你想要的,编译器不会强迫你提供一个对象,这是不是真的需要为这个方法的一个实例
可读性 :实例方法应在实例的状态下工作,而不是仅依据的参数。 如果它是一个实例方法不需要的情况下工作,这是令人困惑的。
在这里表现的区别是没有有效。 你将有一个很难实际测量的时间差(并获得过其他的东西与你的CPU怎么回事的“噪音”),这将是多么的渺小。
除非你碰巧去执行一大堆的数据库查询或信息的数千兆字节的文件对象的构造函数读取(我假设在这里,”这只是空的),将有一个相当小的成本,而且由于这是圈外它不适合所有的。
你应该做基于什么逻辑是有道理的这个决定,而不是根据工作表现,直到你有充分的理由相信,只以违反标准规范/可读性/等进行了显著,和必要的性能增益。
在这种特殊情况下的操作在逻辑上是“静态”。 有没有被使用的状态,所以没有必要有对象的实例,因此该方法应是静态的。 也有人说,它可能会表现得更好,这是非常可能的事实,但不应该是你为什么让静态的。 如果操作逻辑上是合理的一个实例方法,你不应该试图迫使它进入一个静态方法只是为了设法得到它运行得更快; 这是这里学习错误的教训。
只要基准吧:)在理论上静态方法应该,因为它的开销省去了虚拟呼叫,但这种开销可能不是你的情况显著(但我什至不知道的例子是什么语言)更快。 只要时间足够大的迭代次数为它花一分钟左右,看到自己的两个循环。 突出部分确保您使用不平凡的数据,这样你的编译器不优化的叫一声。
根据我的理解,这将是更有益的性能,使它成为一个静态方法。 这意味着,没有创建的对象的实例,虽然在性能上的差异可以忽略不计,我想。 是这样的话,如果没有一些数据,有每次调用静态函数,它可以存储在类对象时重新创建。
你说“只考虑性能”。 在这种情况下,你应该完全专注于什么内部
HelperClass.CalcDaysInQueue(dtBegin,DTEND);
而不是在调用该程序运行时花费的0.0001%。 如果它是一个短程序,JIT编译器将内联无论如何它,在这种情况下会出现的静态和实例方法之间没有任何性能上的差异。