静态内部类是否会影响性能?

3

静态内部类会影响性能吗?还是我应该将相同的静态类编写为非内部类?


2
C#/Java 是什么让人们痴迷于微小的优化? - Matt Briggs
2
@Matt 我认为这不仅仅是针对那些人的。这是每个程序员都会经历的阶段 :) - Rex M
1
这个问题太模糊了,无法回答。你关心哪个性能指标? - Eric Lippert
4个回答

5
如果您的业务/数据逻辑确定一个类应该是内部类,那么请将其设置为内部类。
如果您遇到性能问题,请进行测量以确定问题所在,然后找出需要进行的优化。

1
再加一次 :) 写出最适合你的方式。只有当性能不好时才担心性能。 - Rex M

2
根据我刚刚进行的测试,没有任何差异。
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);
    }
}

输出:

外部类花费了0.28毫秒。
内部类花费了0.27毫秒。

我运行了几次,数字一直都是相同的。

*假设您正在询问访问外部静态类与内部静态类成员(例如调用方法)的成本。如果我误解了,请忽略此测试。


1

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

我们应该忘记小的效率问题,大约97%的时间:过早优化是万恶之源。(唐纳德·克努斯)

除此之外,我非常有信心说没有(重要的)性能差异 - 它只是一个具有不同可见性的普通类。也许在类初始化或使用反射时有一些细微差别,但那几乎不重要。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接