2010-07-19 40 views
2

静态内部类是否存在性能成本?或者我应该只写一个非内部类的静态类?静态内部类是否存在性能成本?

+2

关于c#/ java的一些问题是什么让人们对微观优化感到迷恋? – 2010-07-19 22:27:11

+2

@Matt我不认为这是孤立的。这是每个程序员都要经历的阶段:) – 2010-07-19 22:27:56

+1

这个问题太模糊,无法回答。你关心什么性能指标? – 2010-07-19 23:23:41

回答

5

如果你的业务/数据逻辑确定一个类应该是一个内部类,那么使它成为一个内部类。

如果您遇到性能问题,请进行测量以确定问题所在,然后确定要做出哪些优化。

+1

百万分之一+1)以最适合你的方式写下它。只在性能不佳时担心性能。 – 2010-07-19 22:27:17

1

嵌套类是关于语义和可见性,这些几乎总是比性能更重要。

我们应该忘记小效率,比如97%的时间:过早优化是万恶之源。 (唐纳德克努特)

除此之外,我相当有信心没有(重要的)性能差异 - 它只是一个具有不同可见度的普通类。也许在上课或使用反思时有一些细微的差别,但这应该不会有问题。

1

根据这个测试我只是跑*,没有什么区别。

public static class OuterClass 
{ 
    public static int GetNumber() 
    { 
     return 1; 
    } 

    public static string GetString() 
    { 
     return "Hello, World!"; 
    } 
} 

public class Program 
{ 
    private static class InnerClass 
    { 
     public static int GetNumber() 
     { 
      return 1; 
     } 

     public static string GetString() 
     { 
      return "Hello, World!"; 
     } 
    } 

    const int N = 1000000; 

    public static void Main() 
    { 
     var sw = Stopwatch.StartNew(); 
     for (int i = 0; i < N; ++i) 
     { 
      int x = OuterClass.GetNumber(); 
      string s = OuterClass.GetString(); 
     } 
     sw.Stop(); 

     TimeSpan outerTime = sw.Elapsed; 

     sw.Reset(); 
     sw.Start(); 
     for (int i = 0; i < N; ++i) 
     { 
      int x = InnerClass.GetNumber(); 
      string s = InnerClass.GetString(); 
     } 
     sw.Stop(); 

     TimeSpan innerTime = sw.Elapsed; 

     Console.WriteLine("Outer took {0:0.00} ms.", outerTime.TotalMilliseconds); 
     Console.WriteLine("Inner took {0:0.00} ms.", innerTime.TotalMilliseconds); 
    } 
} 

输出:

 
Outer took 0.28 ms. 
Inner took 0.27 ms. 

我跑了几次和数字是始终不变。

*我假设你问的是访问外部静态内部静态类与内部静态类的成员(例如,调用方法调用)的成本。如果我误解了,这个测试是无关紧要的。

0

不,但是如果您使用泛型的嵌套类,会出现一些严重的语义问题。 (尽管其中一些问题相当积极,例如内部类如何继承父类的类型参数。)

相关问题