1

我有一个辅助方法,它需要一个开始日期和一个结束日期,并通过某些业务逻辑产生一个整数结果。对于给定的数据集,此帮助方法有时会被调用超过 10,000 次(尽管这种情况并不经常发生)。

问题: 仅考虑性能,将此辅助方法作为某个辅助类的静态方法更有效,还是将辅助方法作为类的公共方法更有益?

静态方法示例:

// 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);
}

在此先感谢您的帮助!

4

5 回答 5

2

当您调用实例方法时,编译器总是不可见地传递一个额外的参数,该参数在该方法中的this名称下可用。static方法不代表任何对象调用,因此它们没有this引用。

我认为将实用程序方法标记为的好处很少static

  • 小的 性能this改进,您无需为您不真正使用的参考付费。但是,我怀疑您是否会看到差异。

  • 方便static- 您可以随时随地调用方法,编译器不会强制您提供对象的实例,而该方法并不真正需要

  • 可读性:实例方法应该对实例的状态进行操作,而不仅仅是对参数进行操作。如果它是一个不需要实例工作的实例方法,那就令人困惑了。

于 2012-08-22T17:07:51.793 回答
1

这里的性能差异实际上没什么。您将很难实际测量时间差异(并克服 CPU 上发生的其他事情的“噪音”),这将是多么小。

除非你碰巧去执行一大堆数据库查询或从对象构造函数中的文件中读取几 GB 的信息(我在这里假设它只是空的),否则它将具有相当小的成本,因为它脱离了循环,根本无法扩展。

您应该根据逻辑上的意义做出此决定,而不是基于性能,直到您有充分的理由相信通过违反标准实践/可读性/等可以获得显着且必要的性能提升。

在这种特殊情况下,您的操作在逻辑上是“静态的”。没有使用状态,因此不需要对象的实例,因此应该将方法设为静态。其他人说它可能表现更好,这很可能是真的,但这不应该是你让它静态的原因。如果该操作作为实例方法在逻辑上是有意义的,那么您不应该试图将其强制为静态方法,只是为了让它运行得更快;这是在这里学习错误的教训。

于 2012-08-22T17:42:21.783 回答
0

只需对其进行基准测试:)理论上静态方法应该更快,因为它省去了虚拟调用开销,但在您的情况下这种开销可能并不重要(但我什至不确定该示例使用哪种语言)。只需用足够多的迭代次数对两个循环进行计时,以便花一分钟左右的时间亲眼看看。请确保您使用非平凡数据,以便您的编译器不会优化调用。

于 2012-08-22T17:08:01.683 回答
0

根据我的理解,将其设为静态方法对性能更有利。这意味着没有创建对象的实例,尽管我认为性能差异可以忽略不计。如果每次调用静态函数时不需要重新创建一些数据,这些数据可以存储在类对象中,就会出现这种情况。

于 2012-08-22T17:08:36.833 回答
0

你说'只考虑性能'。在这种情况下,你应该完全专注于里面的东西

HelperClass.CalcDaysInQueue(dtBegin, dtEnd);

而不是调用该例程所花费的 0.0001% 的运行时间。如果它是一个简短的例程,JIT 编译器无论如何都会内联它,在这种情况下,静态方法和实例方法之间不会有性能差异。

于 2012-08-23T09:41:08.197 回答