我一直在阅读StackExchange技术(例如,this article about SO performance on highavailability.com),并注意到他们提到了大量使用静态方法以获得更好的性能。
为什么静态方法表现更好?我认为减少垃圾收集成本与它有关(因为静态方法不需要实例);但是,还有什么吗?
答案 0 :(得分:2)
主要原因与调用堆栈有关。虽然实例方法总是将this
指针作为第一个参数,但静态方法没有那个开销。
在快速系统上只有几毫秒(甚至只是其中的一小部分),但它可以在性能关键系统中累加。
答案 1 :(得分:1)
为什么静态方法表现更好?
我不认为他们这样做。如果传递给静态方法并从其返回的数据留在堆栈上,那么GC时间可能会有一些收获。在这种情况下,它不会被GC跟踪。
我运行了一个程序并且在我的3次尝试中得到了不同的结果,两次静态方法略快,1次(如下所示)实例方法更快。所有数据在合理的偏差范围内。所以我的结论是:如果忽视GC,没有明显的区别。
t1 = 8.0055 ms (instance)
t2 = 8.0119 ms (static)
这是一个快速测试程序
public class Program
{
const int innerMax = 100;
const int outerMax = 1000;
public static void Main()
{
var t1 = new TimeSpan();
var t2 = new TimeSpan();
var program = new Program();
for (int i = 0; i < outerMax; i++)
t1 = program.InstanceAction();
for (int i = 0; i < outerMax; i++)
t2 = StaticAction();
Console.WriteLine("t1 = {0} ms (instance)", t1.TotalMilliseconds);
Console.WriteLine("t2 = {0} ms (static)", t2.TotalMilliseconds);
Console.ReadLine();
}
private TimeSpan InstanceAction()
{
return Time(() => {
var sw = new SpinWait();
for (int i = 0; i < max; i++)
sw.SpinOnce();
});
}
private static TimeSpan StaticAction()
{
return Time(() => {
var sw = new SpinWait();
for (int i = 0; i < innerMax; i++)
sw.SpinOnce();
});
}
private static TimeSpan Time(Action action)
{
Stopwatch stopwatch = Stopwatch.StartNew();
action();
stopwatch.Stop();
return stopwatch.Elapsed;
}
}
答案 2 :(得分:-1)
为了简单和更好,大量使用静态类和方法 性能
真正的性能优势与具体系统设置和针对具体业务领域的具体指标相关,在可能的情况下使用static
类和方法的简单性源于:
1)在静态方法中明确表示“仅执行”流程
2)简单的单元测试,因为你只处理执行工件(静态函数)
3)状态和执行是不同且独立的值,因此没有“隐藏状态”问题(静态非不可变的变量通常是设计不好的标志),否则少量。
总的来说,代码更容易管理,测试,并且可能理解。