[실험1]
static void Main(string[] args)
{
DateTime dt = DateTime.Now;
for (int i = 0; i < 10000000; i++)
{
ABC abc = default(ABC);
//ABC abc = new ABC();
//ABC abc = new ABC(null);
}
Console.WriteLine((DateTime.Now - dt).Milliseconds);
}
public unsafe struct ABC
{
public fixed int array[200];
public ABC(int[] _param) { }
}
이런 코드가 있습니다.
사용할 수 있는 ABC의 생성자는 3가지죠.
default(ABC);
new ABC();
new ABC(null);
이렇게 3개를 테스해봤습니다.
default(ABC); // 220ms
new ABC(); // 220ms
new ABC(null); // 20ms
default(ABC)와 new ABC()는 같은 로직이라고 생각이되네요.
그런데 new ABC(null)은 10배나 빠른 속도를 나타내네요.
[실험2]
그래서 혹시 null이라서 값을 못쓰는거 아닌가? 하고 좀더 추가해봤습니다.
Set과 Add함수를 만들고 사용한것입니다.
빨간색은 위 소스에서 바뀌거나 추가된것입니다.
static void Main(string[] args)
{
DateTime dt = DateTime.Now;
int sum = 0;
for (int i = 0; i < 10000000; i++)
{
ABC abc = default(ABC);
//ABC abc = new ABC();
//ABC abc = new ABC(null);
abc.Set(0, 1);
abc.Add(0, ref sum);
}
Console.WriteLine(sum);
Console.WriteLine((DateTime.Now - dt).Milliseconds);
}
public unsafe struct ABC
{
public fixed int array[200];
public ABC(int[] _param) { }
public void Add(int idx, ref int sum)
{
fixed (int* p = array)
{
sum += p[idx];
}
}
public void Set(int idx, int val)
{
fixed (int* p = array)
{
p[idx] = val;
}
}
}
default(ABC); // 300ms
new ABC(); // 300ms
new ABC(null); // 90ms
??? 또 new ABC가 빠르게 나왔습니다.
[실험3]
Set을 1번만 하고 Add를 여러번 해봤습니다.
static void Main(string[] args)
{
DateTime dt = DateTime.Now;
int sum = 0;
for (int i = 0; i < 100000; i++)
{
ABC abc = default(ABC);
//ABC abc = new ABC();
//ABC abc = new ABC(null);
abc.Set(0, 1);
for(int j=0; j<100; j++)
{
abc.Add(0, ref sum);
}
}
Console.WriteLine(sum);
Console.WriteLine((DateTime.Now - dt).Milliseconds);
}
public unsafe struct ABC
{
public fixed int array[200];
public ABC(int[] _param) { }
public void Add(int idx, ref int sum)
{
fixed (int* p = array)
{
sum += p[idx];
}
}
public void Set(int idx, int val)
{
fixed (int* p = array)
{
p[idx] = val;
}
}
}
default(ABC); // 50ms
new ABC(); // 50ms
new ABC(null); // 50ms
?????????
ABC의 속도가 느려질 수도있다고 생각했는데 하향평준화돼버렸습니다.
이유가 뭘까요..? 궁금해죽겠네요.