developer tip

어레이를 빠르게 제로화하는 방법은 무엇입니까?

optionbox 2021. 1. 9. 09:43
반응형

어레이를 빠르게 제로화하는 방법은 무엇입니까?


현재 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

반응형