Есть ли затраты на производительность статического внутреннего класса? - PullRequest
2 голосов
/ 20 июля 2010

Есть ли затраты на производительность статического внутреннего класса? Или я должен просто написать тот же статический класс, что и не внутренний класс?

Ответы [ 4 ]

5 голосов
/ 20 июля 2010

Если ваша логика бизнеса / данных определяет, что класс должен быть внутренним классом, то сделайте его внутренним классом.

Если у вас проблемы с производительностью, проведите измерения, чтобы определить, в чем проблема, а затем определите, какие оптимизации следует предпринять.

1 голос
/ 20 июля 2010

Согласно этому тесту, который я только что провел *, нет никакой разницы.

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.

Я запускал его несколько раз, и цифры были одинаковыми.

* Я предполагаю, что вы спрашивали о стоимости доступа к членам (например, вызовам методов) внешних статических и внутренних статических классов. Если я неправильно понял, этот тест не имеет значения.

1 голос
/ 20 июля 2010

Классы вложенности связаны с семантикой и видимостью, и они почти всегда намного важнее производительности.

Мы должны забыть о малой эффективности, скажем, в 97% случаев: преждевременная оптимизация - корень всего зла. (Дональд Кнут)

Кроме того, я вполне уверен, что нет (важной) разницы в производительности - это просто обычный класс с разной видимостью. Может быть, есть некоторая тонкая разница во время инициализации класса или при использовании рефлексии, но это вряд ли должно иметь значение.

0 голосов
/ 20 июля 2010

Нет, но есть некоторые серьезные семантические проблемы, если вы используете вложенные классы с обобщениями.(Хотя некоторые из этих проблем весьма положительны, например, как внутренний класс наследует параметры типа родительского класса.)

...