性能和静态方法与公共方法

时间:2012-08-22 17:03:20

标签: c# performance static-methods

我有一个辅助方法,它采用开始日期和结束日期,并通过某些业务逻辑产生整数结果。对于给定的一组数据,这种辅助方法有时会被调用超过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);
}

提前感谢您的帮助!

5 个答案:

答案 0 :(得分:2)

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

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

  • 效果改进,您不需要支付对您实际没用的this的引用。但是我怀疑你会看到不同之处。

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

  • 可读性:实例方法应该在实例的状态下运行,而不仅仅是在参数上运行。如果它是一个不需要实例工作的实例方法,那就太麻烦了。

答案 1 :(得分:1)

这里的表现差异实际上没什么。你将很难实际测量时间上的差异(并克服你的CPU正在进行的其他事情的“噪音”),这将是多么小。

除非你碰巧去执行一大堆数据库查询或从对象构造函数中的文件读取几千兆字节的信息(我假设这里'它只是空的)它的成本相当低,因为它不在循环中,所以根本不会扩展。

你应该根据逻辑上有意义而不是基于性能做出这个决定,直到你有充分的理由相信通过违反标准做法/可读性/等来获得重大且必要的性能提升。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

根据我的理解,将性能作为静态方法对性能更有益。这意味着没有创建对象的实例,但我认为性能差异可以忽略不计。如果每次调用静态函数时都不需要重新创建某些数据,那么就是这种情况,静态函数可以存储在类对象中。

答案 4 :(得分:0)

你说'只考虑表现'。在这种情况下,你应该完全专注于内部的什么

HelperClass.CalcDaysInQueue(dtBegin,dtEnd);

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