[팁] 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*을 참고하기 바란다.