어레이를 빠르게 제로화하는 방법은 무엇입니까?
현재 for 루프에서 수행하고 있으며 C에는 ZeroMemory API가 있지만 C #에서는 사용할 수없는 것 같습니다. Java의 다소 동등한 Array.fill도 존재하지 않습니다. 더 쉽고 빠른 방법이 있는지 궁금합니다.
Array.Clear () 시도하십시오 .
요소 형식에 따라 Array의 요소 범위를 0, to
false
또는null
(Visual Basic의 경우 Nothing)으로 설정합니다.
C ++ :
memset(array, 0, array_length_in_bytes);
C ++ 11 :
array.fill(0);
씨#:
Array.Clear(array, startingIndex, length);
자바:
Arrays.fill(array, value);
Array.Clear(integerArray, 0, integerArray.Length);
최신 정보
및 성능 에 관한 벤치 마크 를 기반으로 어레이를 제로화 할 때 고려해야 할 두 가지 주요 사례 가 있다고 말할 수 있습니다 .Array.Clear()
array[x] = default(T)
A) 1..76 항목 길이 의 배열이 있습니다 .
B) 항목 길이 가 77 개 이상인 배열이 있습니다 .
따라서 플롯 의 주황색 선은 Array.Clear()
접근을 나타냅니다 .
플롯 의 파란색 선은 array[x] = default(T)
접근 방식을 나타냅니다 (배열을 반복하고 값을로 설정 default(T)
).
이 작업을 수행하기 위해 Helper를 한 번 작성할 수 있습니다.
public static class ArrayHelper
{
// Performance-oriented algorithm selection
public static void SelfSetToDefaults<T>(this T[] sourceArray)
{
if (sourceArray.Length <= 76)
{
for (int i = 0; i < sourceArray.Length; i++)
{
sourceArray[i] = default(T);
}
}
else { // 77+
Array.Clear(
array: sourceArray,
index: 0,
length: sourceArray.Length);
}
}
}
용법:
someArray.SelfSetToDefaults();
여러 사람들이 답변을 게시 한 다음 삭제하여 모든 언어에서 for 루프가 memset 또는 FillMemory 또는 기타 기능과 동일하게 수행 될 것이라고 말했습니다.
예를 들어 컴파일러는 64 비트 제로 할당 명령어 (사용 가능한 경우)를 활용하기 위해 64 비트 정렬 조각으로 청크 할 수 있습니다. 정렬과 물건을 고려할 것입니다. Memset의 구현은 확실히 사소하지 않습니다.
memset.asm 하나 . memset-is-faster-than-simple-loop.html 도 참조하십시오 .
컴파일러와 표준 라이브러리 작성자의 무한한 기만성을 결코 과소 평가하지 마십시오.
dll import를 사용하여 메서드를 호출합니다. 빠르고 사용하기 쉽습니다. :)
[DllImport("msvcrt.dll", EntryPoint = "memset", CallingConvention = CallingConvention.Cdecl, SetLastError = false)]
public static extern IntPtr MemSet(IntPtr dest, int c, int byteCount);
c는 메모리에 설정하려는 값입니다.
또는
[DllImport("kernel32.dll", EntryPoint="RtlZeroMemory")]
public unsafe static extern bool ZeroMemory(byte* destination, int length);
이것은 주어진 배열을 0으로 만 설정합니다.
참조 URL : https://stackoverflow.com/questions/1407715/how-to-quickly-zero-out-an-array
'developer tip' 카테고리의 다른 글
Swift 내에서 프로그래밍 방식으로 탭 간 전환 (0) | 2021.01.09 |
---|---|
WordPress 사이트에서 bitnami 배너를 제거하려면 어떻게해야합니까? (0) | 2021.01.09 |
Apache에서 POST 데이터를 기록하는 가장 좋은 방법은 무엇입니까? (0) | 2021.01.08 |
웹 개발에 대한 기본적이지만 중요한 질문이 있습니까? (0) | 2021.01.08 |
여러 줄 셀로 테이블을 코딩하는 방법 (0) | 2021.01.08 |