私はC#console-appを作成しています。いくつかのクリティカルなパスがあり、構造体の作成には構造体のガベージコレクションが不要なので、クラスを作成するよりも高速であると考えました。しかし私のテストでは、私はその反対を見つけた。構造体がクラスより遅いのはなぜですか?
以下のテストでは、1000個の構造体と1000個のクラスを作成します。
class Program
{
static void Main(string[] args)
{
int iterations = 1000;
Stopwatch sw = new Stopwatch();
sw.Start();
List<Struct22> structures = new List<Struct22>();
for (int i = 0; i < iterations; ++i)
{
structures.Add(new Struct22());
}
sw.Stop();
Console.WriteLine($"Struct creation consumed {sw.ElapsedTicks} ticks");
Stopwatch sw2 = new Stopwatch();
sw2.Start();
List<Class33> classes = new List<Class33>();
for (int i = 0; i < iterations; ++i)
{
classes.Add(new Class33());
}
sw2.Stop();
Console.WriteLine($"Class creation consumed {sw2.ElapsedTicks} ticks");
Console.ReadLine();
}
}
マイクラッセ/構造体は単純です:
class Class33
{
public int Property { get; set; }
public int Field;
public void Method() { }
}
struct Struct22
{
public int Property { get; set; }
public int Field;
public void Method() { }
}
結果(ドラムロールしてください...)
Struct creating consuming 3038 ticks
Class creating consuming 404 ticks
そこで質問です:なぜそれは10倍近くかかるだろうクラスの時間はStructの時間よりも短くなりますか?
EDIT。私は、プロパティに整数を割り当てるだけで、このプログラムを「何かする」ようにしました。
static void Main(string[] args)
{
int iterations = 10000000;
Stopwatch sw = new Stopwatch();
sw.Start();
List<Struct22> structures = new List<Struct22>();
for (int i = 0; i < iterations; ++i)
{
Struct22 s = new Struct22()
{
Property = 2,
Field = 3
};
structures.Add(s);
}
sw.Stop();
Console.WriteLine($"Struct creating consuming {sw.ElapsedTicks} ticks");
Stopwatch sw2 = new Stopwatch();
sw2.Start();
List<Class33> classes = new List<Class33>();
for (int i = 0; i < iterations; ++i)
{
Class33 c = new Class33()
{
Property = 2,
Field = 3
};
classes.Add(c);
}
sw2.Stop();
Console.WriteLine($"Class creating consuming {sw2.ElapsedTicks} ticks");
Console.ReadLine();
}
となり、結果は私にとって驚異的です。クラスはまだ少なくとも2倍ですが、整数を割り当てるという単純な事実には20倍のインパクトがあります!
Struct creating consuming 903456 ticks
Class creating consuming 4345929 ticks
EDIT:私のクラスまたは構造体には参照型が存在しないので、私はメソッドへの参照を削除:
class Class33
{
public int Property { get; set; }
public int Field;
}
struct Struct22
{
public int Property { get; set; }
public int Field;
}
あなたは実際に意味のあることはしていません。何もしない測定は実際にあなたに何も言わない。 – Servy
ストラクチャとクラスは長い間議論されています。問題を見つけるためには本当に重要な道筋である部品を測定する必要があります。 [このディスカッション](http://stackoverflow.com/questions/3942721/structs-versus-classes) –
[これら](https://msdn.microsoft.com/en-us/library/ms229017.aspx)構造体やクラスの使用について考えるときに考慮すべき事柄:_ "型のインスタンスが** small **であり、通常は**短命**であるか、または他のオブジェクトに一般に埋め込まれている場合、クラスの代わりにstructを使用します。 X型は、型に以下の特性がすべて含まれていない限り構造体を定義します。 これは基本的な型(int、doubleなど)に似た**単一値**を論理的に表します 16バイト。 **不変**。 頻繁に囲む必要はありません。 "_ –