int[]
의 두 배열을 추가하는 것보다 C#이 두 개의 배열 UInt16[]
을 더 빨리 추가하는 것 같습니다. 이것은 배열이 워드로 정렬 될 것이라고 가정했기 때문에 나에게 의미가 없으므로 int[]
은 CPU에서 더 적은 작업이 필요합니까? UInt16 배열이 int 배열보다 빠르게 추가되는 이유는 무엇입니까?
Int for 1000 took 9896625613 tick (4227 msec)
UInt16 for 1000 took 6297688551 tick (2689 msec)
테스트 코드는 다음을 수행합니다
- 한 번
a
및b
을,라는 두 개의 배열을 작성합니다. - 무작위 데이터로 한 번 채 웁니다.
- 스톱워치를 시작합니다.
a
및b
을 항목별로 추가합니다. 이것은 1000 번 수행됩니다.- 스톱워치를 중지합니다.
- 소요 기간을보고합니다.
int[] a, b
및 UInt16 a,b
에 대해 수행됩니다. 그리고 마다 번 코드를 실행하면 UInt16
어레이의 테스트는 int
어레이보다 30 % -50 % 적은 시간이 소요됩니다. 이걸 나에게 설명해 줄 수 있니? 당신이 만약 자신을 위해 시도 할 경우
여기에 코드입니다 :
public static UInt16[] GenerateRandomDataUInt16(int length)
{
UInt16[] noise = new UInt16[length];
Random random = new Random((int)DateTime.Now.Ticks);
for (int i = 0; i < length; ++i)
{
noise[i] = (UInt16)random.Next();
}
return noise;
}
public static int[] GenerateRandomDataInt(int length)
{
int[] noise = new int[length];
Random random = new Random((int)DateTime.Now.Ticks);
for (int i = 0; i < length; ++i)
{
noise[i] = (int)random.Next();
}
return noise;
}
public static int[] AddInt(int[] a, int[] b)
{
int len = a.Length;
int[] result = new int[len];
for (int i = 0; i < len; ++i)
{
result[i] = (int)(a[i] + b[i]);
}
return result;
}
public static UInt16[] AddUInt16(UInt16[] a, UInt16[] b)
{
int len = a.Length;
UInt16[] result = new UInt16[len];
for (int i = 0; i < len; ++i)
{
result[i] = (ushort)(a[i] + b[i]);
}
return result;
}
public static void Main()
{
int count = 1000;
int len = 128 * 6000;
int[] aInt = GenerateRandomDataInt(len);
int[] bInt = GenerateRandomDataInt(len);
Stopwatch s = new Stopwatch();
s.Start();
for (int i=0; i<count; ++i)
{
int[] resultInt = AddInt(aInt, bInt);
}
s.Stop();
Console.WriteLine("Int for " + count
+ " took " + s.ElapsedTicks + " tick ("
+ s.ElapsedMilliseconds + " msec)");
UInt16[] aUInt16 = GenerateRandomDataUInt16(len);
UInt16[] bUInt16 = GenerateRandomDataUInt16(len);
s = new Stopwatch();
s.Start();
for (int i=0; i<count; ++i)
{
UInt16[] resultUInt16 = AddUInt16(aUInt16, bUInt16);
}
s.Stop();
Console.WriteLine("UInt16 for " + count
+ " took " + s.ElapsedTicks + " tick ("
+ s.ElapsedMilliseconds + " msec)");
}
배열을 전달하고 반환하는 AddXXX 함수를 호출하지 않고도 인라인 요소를 추가하려고 했습니까? 다른 크기의 배열을 사용해 보셨습니까? –
@ Grzegorz Gierlik : 참으로 좋은 질문입니다. 그대로,'int' 루틴은 아마도 두 배의 메모리를 할당해야 할 것입니다. –
어떤 하드웨어가 있습니까? 나는 15650msec와 14657msec에 도착한다. (큰 차이는 없다.) 나는 microbenchmark가 당신을 쫓아 내고 있다고 의심합니다 - JIT 엔진과 최적화 VM은 그것에 대해 악명 높습니다. 현대 x86/x64 CPU에서 숫자 (16/32 비트) *를 추가하는 속도는 동일합니다 *. 그러나 더 큰 숫자는 더 많은 캐시 라인을 채우고 더 많은 버스를 전송해야하는 측면에서 작은 페널티를 나타낼 수 있습니다. –