.NET + 많은 양의 메모리 트릭 복사
-
02-07-2019 - |
문제
옛날에는 한 위치에서 다른 위치로 큰 메모리 덩어리를 복사하기 위해 (종종 블리팅 오프 스크린 프레임 버퍼를 위해) 사용 된 트릭이 사용되었습니다.
이제 C#에서 작업 했으므로 한 메모리 위치에서 초당 약 60 회 이상의 바이트 (대략 32k) 배열을 이동해야 할 필요성을 발견했습니다.
어쨌든, 나는 for 루프의 바이트 사본이 여기서 최적이라고 생각하지 않습니다.
여전히 순수하게 관리되는 코드를 유지하면서 이런 종류의 작업을 수행하는 좋은 트릭을 알고 있습니까?
그렇지 않다면, 나는 p/를 호출하거나 안전하지 않은 모드로 이동하려고하지만 크로스 플랫폼의 이유로 가능하다면 관리를 유지하고 싶습니다.
편집 : 재미를 위해 작성한 일부 벤치마킹 코드 :
바이트 바이트 : 15.6192
루프 당 4 바이트 : 15.6192
블록 카피 : 0
Byte[] src = new byte[65535];
Byte[] dest = new byte[65535];
DateTime startTime, endTime;
startTime = DateTime.Now;
for (int k = 0; k < 60; k++)
{
for (int i = 0; i < src.Length; i++)
{
dest[i] = src[i];
}
}
endTime = DateTime.Now;
Console.WriteLine("Byte by Byte: " + endTime.Subtract(startTime).TotalMilliseconds);
startTime = DateTime.Now;
for (int k = 0; k < 60; k++)
{
int i = 0;
while (i < src.Length)
{
if (i + 4 > src.Length)
{
// Copy the remaining bytes one at a time.
while(i < src.Length)
{
dest[i] = src[i];
i++;
}
break;
}
dest[i] = src[i];
dest[i + 1] = src[i + 1];
dest[i + 2] = src[i + 2];
dest[i + 3] = src[i + 3];
i += 4;
}
}
endTime = DateTime.Now;
Console.WriteLine("4 Bytes per loop: " + endTime.Subtract(startTime).TotalMilliseconds);
startTime = DateTime.Now;
for (int k = 0; k < 60; k++)
{
Buffer.BlockCopy(src, 0, dest,0, src.Length);
}
endTime = DateTime.Now;
Console.WriteLine("Block Copy: " + endTime.Subtract(startTime).TotalMilliseconds);
해결책
옳은 일을하기 위해 buffer.blockcopy ()를 믿을 수 있다고 생각합니다.
http://msdn.microsoft.com/en-us/library/system.buffer.blockcopy.aspx
제휴하지 않습니다 StackOverflow