# Class Struct in Structを列挙したときのパフォーマンス計測
## 環境
.net7 window10
core i7-8700
memory
## ソースコード
```csharp=
using BenchmarkDotNet.Attributes;
using System.Runtime.CompilerServices;
namespace Benchmark_DataType
{
[MemoryDiagnoser]
//[ShortRunJob]
[MinColumn, MaxColumn]
public class DataSizeBenchmark3
{
private const int ArraySize = 1024 * 16;
private readonly Struct1[] struct1 = new Struct1[ArraySize];
private readonly Struct2[] struct2 = new Struct2[ArraySize];
private readonly Struct4[] struct4 = new Struct4[ArraySize];
private readonly Struct8[] struct8 = new Struct8[ArraySize];
private readonly Struct16[] struct16 = new Struct16[ArraySize];
private readonly Struct32[] struct32= new Struct32[ArraySize];
private readonly Struct64[] struct64 = new Struct64[ArraySize];
private readonly Struct128[] struct128 = new Struct128[ArraySize];
private readonly Class1[] class1 = new Class1[ArraySize];
private readonly Class2[] class2 = new Class2[ArraySize];
private readonly Class4[] class4 = new Class4[ArraySize];
private readonly Class8[] class8 = new Class8[ArraySize];
private readonly Class16[] class16 = new Class16[ArraySize];
private readonly Class32[] class32= new Class32[ArraySize];
private readonly Class64[] class64 = new Class64[ArraySize];
private readonly Class128[] class128 = new Class128[ArraySize];
public DataSizeBenchmark3()
{
for (int i = 0; i < ArraySize; i++)
{
struct1[i] = new Struct1();
struct2[i] = new Struct2();
struct4[i] = new Struct4();
struct8[i] = new Struct8();
struct16[i] = new Struct16();
struct32[i] = new Struct32();
struct64[i] = new Struct64();
struct128[i] = new Struct128();
class1[i] = new Class1();
class2[i] = new Class2();
class4[i] = new Class4();
class8[i] = new Class8();
class16[i] = new Class16();
class32[i] = new Class32();
class64[i] = new Class64();
class128[i] = new Class128();
}
}
[Benchmark]
public long Struct1()
{
var sum = 0L;
for (int i = 0; i < ArraySize; i++)
{
sum += Sum(struct1[i]);
}
return sum;
}
[Benchmark]
public long InStruct1()
{
var sum = 0L;
for (int i = 0; i < ArraySize; i++)
{
sum += Sum(in struct1[i]);
}
return sum;
}
[Benchmark]
public long Class1()
{
var sum = 0L;
for (int i = 0; i < ArraySize; i++)
{
sum += Sum(class1[i]);
}
return sum;
}
[Benchmark]
public long Struct2()
{
var sum = 0L;
for (int i = 0; i < ArraySize; i++)
{
sum += Sum(struct2[i]);
}
return sum;
}
[Benchmark]
public long InStruct2()
{
var sum = 0L;
for (int i = 0; i < ArraySize; i++)
{
sum += Sum(in struct2[i]);
}
return sum;
}
[Benchmark]
public long Class2()
{
var sum = 0L;
for (int i = 0; i < ArraySize; i++)
{
sum += Sum(class2[i]);
}
return sum;
}
[Benchmark]
public long Struct4()
{
var sum = 0L;
for (int i = 0; i < ArraySize; i++)
{
sum += Sum(struct4[i]);
}
return sum;
}
[Benchmark]
public long InStruct4()
{
var sum = 0L;
for (int i = 0; i < ArraySize; i++)
{
sum += Sum(in struct4[i]);
}
return sum;
}
[Benchmark]
public long Class4()
{
var sum = 0L;
for (int i = 0; i < ArraySize; i++)
{
sum += Sum(class4[i]);
}
return sum;
}
[Benchmark]
public long Struct8()
{
var sum = 0L;
for (int i = 0; i < ArraySize; i++)
{
sum += Sum(struct8[i]);
}
return sum;
}
[Benchmark]
public long InStruct8()
{
var sum = 0L;
for (int i = 0; i < ArraySize; i++)
{
sum += Sum(in struct8[i]);
}
return sum;
}
[Benchmark]
public long Class8()
{
var sum = 0L;
for (int i = 0; i < ArraySize; i++)
{
sum += Sum(class8[i]);
}
return sum;
}
[Benchmark]
public long Struct16()
{
var sum = 0L;
for (int i = 0; i < ArraySize; i++)
{
sum += Sum(struct16[i]);
}
return sum;
}
[Benchmark]
public long InStruct16()
{
var sum = 0L;
for (int i = 0; i < ArraySize; i++)
{
sum += Sum(in struct16[i]);
}
return sum;
}
[Benchmark]
public long Class16()
{
var sum = 0L;
for (int i = 0; i < ArraySize; i++)
{
sum += Sum(class16[i]);
}
return sum;
}
[Benchmark]
public long Struct32()
{
var sum = 0L;
for (int i = 0; i < ArraySize; i++)
{
sum += Sum(struct32[i]);
}
return sum;
}
[Benchmark]
public long InStruct32()
{
var sum = 0L;
for (int i = 0; i < ArraySize; i++)
{
sum += Sum(in struct32[i]);
}
return sum;
}
[Benchmark]
public long Class32()
{
var sum = 0L;
for (int i = 0; i < ArraySize; i++)
{
sum += Sum(class32[i]);
}
return sum;
}
[Benchmark]
public long Struct64()
{
var sum = 0L;
for (int i = 0; i < ArraySize; i++)
{
sum += Sum(struct64[i]);
}
return sum;
}
[Benchmark]
public long InStruct64()
{
var sum = 0L;
for (int i = 0; i < ArraySize; i++)
{
sum += Sum(in struct64[i]);
}
return sum;
}
[Benchmark]
public long Class64()
{
var sum = 0L;
for (int i = 0; i < ArraySize; i++)
{
sum += Sum(class64[i]);
}
return sum;
}
[Benchmark]
public long Struct128()
{
var sum = 0L;
for (int i = 0; i < ArraySize; i++)
{
sum += Sum(struct128[i]);
}
return sum;
}
[Benchmark]
public long InStruct128()
{
var sum = 0L;
for (int i = 0; i < ArraySize; i++)
{
sum += Sum(in struct128[i]);
}
return sum;
}
[Benchmark]
public long Class128()
{
var sum = 0L;
for (int i = 0; i < ArraySize; i++)
{
sum += Sum(class128[i]);
}
return sum;
}
[MethodImpl(MethodImplOptions.NoOptimization)]
public long Sum(Struct1 v)
{
return v.a + v.a + v.a + v.a;
}
[MethodImpl(MethodImplOptions.NoOptimization)]
public long Sum(in Struct1 v)
{
return v.a + v.a + v.a + v.a;
}
[MethodImpl(MethodImplOptions.NoOptimization)]
public long Sum(in Class1 v)
{
return v.a + v.a + v.a + v.a;
}
[MethodImpl(MethodImplOptions.NoOptimization)]
public long Sum(Struct2 v)
{
return v.a + v.a + v.a + v.a;
}
[MethodImpl(MethodImplOptions.NoOptimization)]
public long Sum(in Struct2 v)
{
return v.a + v.a + v.a + v.a;
}
[MethodImpl(MethodImplOptions.NoOptimization)]
public long Sum(in Class2 v)
{
return v.a + v.a + v.a + v.a;
}
[MethodImpl(MethodImplOptions.NoOptimization)]
public long Sum(Struct4 v)
{
return v.a + v.a + v.a + v.a;
}
[MethodImpl(MethodImplOptions.NoOptimization)]
public long Sum(in Struct4 v)
{
return v.a + v.a + v.a + v.a;
}
[MethodImpl(MethodImplOptions.NoOptimization)]
public long Sum(in Class4 v)
{
return v.a + v.a + v.a + v.a;
}
[MethodImpl(MethodImplOptions.NoOptimization)]
public long Sum(Struct8 v)
{
return v.a + v.a + v.a + v.a;
}
[MethodImpl(MethodImplOptions.NoOptimization)]
public long Sum(in Struct8 v)
{
return v.a + v.a + v.a + v.a;
}
[MethodImpl(MethodImplOptions.NoOptimization)]
public long Sum(in Class8 v)
{
return v.a + v.a + v.a + v.a;
}
[MethodImpl(MethodImplOptions.NoOptimization)]
public long Sum(Struct16 v)
{
return v.a + v.b + v.a + v.b;
}
[MethodImpl(MethodImplOptions.NoOptimization)]
public long Sum(in Struct16 v)
{
return v.a + v.b + v.a + v.b;
}
[MethodImpl(MethodImplOptions.NoOptimization)]
public long Sum(in Class16 v)
{
return v.a + v.b + v.a + v.b;
}
[MethodImpl(MethodImplOptions.NoOptimization)]
public long Sum(Struct32 v)
{
return v.a + v.b + v.c + v.d;
}
[MethodImpl(MethodImplOptions.NoOptimization)]
public long Sum(in Struct32 v)
{
return v.a + v.b + v.c + v.d;
}
[MethodImpl(MethodImplOptions.NoOptimization)]
public long Sum(Class32 v)
{
return v.a + v.b + v.c + v.d;
}
[MethodImpl(MethodImplOptions.NoOptimization)]
public long Sum(Struct64 v)
{
return v.a + v.b + v.c + v.d;
}
[MethodImpl(MethodImplOptions.NoOptimization)]
public long Sum(in Struct64 @struct)
{
return @struct.a + @struct.b + @struct.c + @struct.d;
}
[MethodImpl(MethodImplOptions.NoOptimization)]
public long Sum(Class64 v)
{
return v.a + v.b + v.c + v.d;
}
[MethodImpl(MethodImplOptions.NoOptimization)]
public long Sum(Struct128 v)
{
return v.a + v.b + v.c + v.d;
}
[MethodImpl(MethodImplOptions.NoOptimization)]
public long Sum(in Struct128 @struct)
{
return @struct.a + @struct.b + @struct.c + @struct.d;
}
[MethodImpl(MethodImplOptions.NoOptimization)]
public long Sum(Class128 v)
{
return v.a + v.b + v.c + v.d;
}
}
public readonly struct Struct1
{
public readonly byte a;
public Struct1()
{
a = (byte)Random.Shared.Next();
}
}
public readonly struct Struct2
{
public readonly short a;
public Struct2()
{
a = (short)Random.Shared.Next();
}
}
public readonly struct Struct4
{
public readonly int a;
public Struct4()
{
a = Random.Shared.Next();
}
}
public readonly struct Struct8
{
public readonly long a;
public Struct8()
{
a = Random.Shared.NextInt64();
}
}
public readonly struct Struct16
{
public readonly long a;
public readonly long b;
public Struct16()
{
a = Random.Shared.NextInt64();
b = Random.Shared.NextInt64();
}
}
public readonly struct Struct32
{
public readonly long a;
public readonly long b;
public readonly long c;
public readonly long d;
public Struct32()
{
a = Random.Shared.NextInt64();
b = Random.Shared.NextInt64();
c = Random.Shared.NextInt64();
d = Random.Shared.NextInt64();
}
}
public readonly struct Struct64
{
public readonly long a;
public readonly long b;
public readonly long c;
public readonly long d;
public readonly long e;
public readonly long f;
public readonly long g;
public readonly long h;
public Struct64()
{
a = Random.Shared.NextInt64();
b = Random.Shared.NextInt64();
c = Random.Shared.NextInt64();
d = Random.Shared.NextInt64();
e = Random.Shared.NextInt64();
f = Random.Shared.NextInt64();
g = Random.Shared.NextInt64();
h = Random.Shared.NextInt64();
}
}
public readonly struct Struct128
{
public readonly long a;
public readonly long b;
public readonly long c;
public readonly long d;
public readonly long e;
public readonly long f;
public readonly long g;
public readonly long h;
public readonly long i;
public readonly long j;
public readonly long k;
public readonly long l;
public readonly long m;
public readonly long n;
public readonly long o;
public readonly long p;
public Struct128()
{
a = Random.Shared.NextInt64();
b = Random.Shared.NextInt64();
c = Random.Shared.NextInt64();
d = Random.Shared.NextInt64();
e = Random.Shared.NextInt64();
f = Random.Shared.NextInt64();
g = Random.Shared.NextInt64();
h = Random.Shared.NextInt64();
i = Random.Shared.NextInt64();
j = Random.Shared.NextInt64();
k = Random.Shared.NextInt64();
l = Random.Shared.NextInt64();
m = Random.Shared.NextInt64();
n = Random.Shared.NextInt64();
o = Random.Shared.NextInt64();
p = Random.Shared.NextInt64();
}
}
public class Class1
{
public readonly byte a;
public Class1()
{
a = (byte)Random.Shared.Next();
}
}
public class Class2
{
public readonly short a;
public Class2()
{
a = (short)Random.Shared.Next();
}
}
public class Class4
{
public readonly int a;
public Class4()
{
a = Random.Shared.Next();
}
}
public class Class8
{
public readonly long a;
public Class8()
{
a = Random.Shared.NextInt64();
}
}
public class Class16
{
public readonly long a;
public readonly long b;
public Class16()
{
a = Random.Shared.NextInt64();
b = Random.Shared.NextInt64();
}
}
public class Class32
{
public readonly long a;
public readonly long b;
public readonly long c;
public readonly long d;
public Class32()
{
a = Random.Shared.NextInt64();
b = Random.Shared.NextInt64();
c = Random.Shared.NextInt64();
d = Random.Shared.NextInt64();
}
}
public class Class64
{
public readonly long a;
public readonly long b;
public readonly long c;
public readonly long d;
public readonly long e;
public readonly long f;
public readonly long g;
public readonly long h;
public Class64()
{
a = Random.Shared.NextInt64();
b = Random.Shared.NextInt64();
c = Random.Shared.NextInt64();
d = Random.Shared.NextInt64();
e = Random.Shared.NextInt64();
f = Random.Shared.NextInt64();
g = Random.Shared.NextInt64();
h = Random.Shared.NextInt64();
}
}
public class Class128
{
public readonly long a;
public readonly long b;
public readonly long c;
public readonly long d;
public readonly long e;
public readonly long f;
public readonly long g;
public readonly long h;
public readonly long i;
public readonly long j;
public readonly long k;
public readonly long l;
public readonly long m;
public readonly long n;
public readonly long o;
public readonly long p;
public Class128()
{
a = Random.Shared.NextInt64();
b = Random.Shared.NextInt64();
c = Random.Shared.NextInt64();
d = Random.Shared.NextInt64();
e = Random.Shared.NextInt64();
f = Random.Shared.NextInt64();
g = Random.Shared.NextInt64();
h = Random.Shared.NextInt64();
i = Random.Shared.NextInt64();
j = Random.Shared.NextInt64();
k = Random.Shared.NextInt64();
l = Random.Shared.NextInt64();
m = Random.Shared.NextInt64();
n = Random.Shared.NextInt64();
o = Random.Shared.NextInt64();
p = Random.Shared.NextInt64();
}
}
}
```
## 計測結果

