静的内部クラスにパフォーマンス コストはありますか? それとも、非内部クラスと同じ静的クラスを作成する必要がありますか?
4 に答える
ビジネス/データ ロジックによって、あるクラスを内部クラスにする必要があると判断された場合は、そのクラスを内部クラスにします。
パフォーマンスに問題がある場合は、測定を行って問題がどこにあるかを特定し、次にどのような最適化を行うかを決定します。
私が実行したこのテストによると*、違いはありません。
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 ミリ秒かかりました。
数回実行しましたが、数値は一貫して同じでした。
*外側の静的クラスと内側の静的クラスのメンバーへのアクセス (メソッド呼び出しなど) のコストについて質問されたと思います。誤解していれば、このテストは意味がありません。
クラスのネストはセマンティクスと可視性に関するものであり、ほとんどの場合、これらはパフォーマンスよりもはるかに重要です。
約 97% の確率で、わずかな効率性を忘れる必要があります。時期尚早の最適化は諸悪の根源です。(ドナルド・クヌース)
それに加えて、(重要な)パフォーマンスの違いはないと確信しています。これは、可視性が異なる単なる通常のクラスです。クラスの初期化時またはリフレクションの使用時に微妙な違いがあるかもしれませんが、それはほとんど問題になりません。
いいえ、ただし、ジェネリックでネストされたクラスを使用している場合、深刻なセマンティックの問題がいくつかあります。(ただし、内部クラスが親クラスの型パラメーターを継承する方法など、これらの問題のいくつかは非常に肯定的です。)