[팁] C# CollectionsMarshal.AsSpan 용도

[팁] C# CollectionsMarshal.AsSpan 용도

이철우

메모리에 접근하는 코드의 성능을 높이려면, Span<‘T’>(C# 7.2부터 지원)을 사용하게 된다.

만약 T가 클래스 형이 아니라 변경가능한 struct 형이고,
Span으로 변환된 것의 한 항목의 값을 바꾸는 경우를 코딩하자.

struct Mutable
{
    public int Value;

    public Mutable()
    {
    }
}
public static void Run()
{
    // 생성할 때 Span으로 형 변환.
    Span<Mutable> spanOfStructs = new Mutable[1] { new Mutable() };
    spanOfStructs[0].Value = 42;
    Assert.AreEqual(42, spanOfStructs[0].Value);

    // 나중에 Span으로 형 변환.
    var listOfStructs = new List<Mutable> { new Mutable() };
    //listOfStructs[0].Value = 42; <- Compile Error!
    var spanOfStructsAfter = CollectionsMarshal.AsSpan(listOfStructs);
    spanOfStructsAfter[0].Value = 42;
    Assert.AreEqual(42, spanOfStructsAfter[0].Value);
}

위 코드 [생성할 때 Span으로 형 변환]에는 에러가 없지만,
[나중에 Span으로 형 변환]에서는 Mutable이 struct 형이어서 컴파일 에러가 있다. 이를 해결하려면,

CollectionsMarshal.AsSpan

이 필요하다. 물론, Mutable이 class 형이라면, 위 컴파일 에러는 없다.

Span 성능에 대해서는 *Faster .NET List loops with CollectionsMarshal.AsSpan*을 참고하기 바란다.

4개의 좋아요