[팁] 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*을 μ°Έκ³ ν•˜κΈ° λ°”λž€λ‹€.

3개의 μ’‹μ•„μš”