본문 바로가기
C#

[C#] 8.0 고성능이 필요한 환경에서 GC가 발생하지 않는 네이티브 힙 사용

by Jcoder 2020. 12. 1.

 

.NET Framework: 866. C# - 고성능이 필요한 환경에서 GC가 발생하지 않는 네이티브 힙 사용 (sysnet.pe.kr)

 

.NET Framework: 866. C# - 고성능이 필요한 환경에서 GC가 발생하지 않는 네이티브 힙 사용

글쓴 사람 정성태 (techsharer at outlook.com) 홈페이지 첨부 파일 부모글 보이기/감추기 C# - 고성능이 필요한 환경에서 GC가 발생하지 않는 네이티브 힙 사용 지난 발표에서, .NET Conf 2019 Korea - "닷넷 17

www.sysnet.pe.kr

 

    public unsafe ref struct NativeMemory<T> where T : unmanaged

    {

        int _size;

        IntPtr _ptr;

 

        public NativeMemory(int size)

        {

            _size = size;

 

            long lSize = _size;

            lSize *= sizeof(T);

                    

            IntPtr bufSize = new IntPtr(lSize);

            _ptr = Marshal.AllocHGlobal(bufSize);

        }

 

        public Span<T> GetView()

        {

            return new Span<T>(_ptr.ToPointer(), _size);

        }

 

        // C# 8.0에서만 using과 함께 사용 가능

        public void Dispose()

        {

            if (_ptr == IntPtr.Zero)

            {

                return;

            }

 

            Marshal.FreeHGlobal(_ptr);

            _ptr = IntPtr.Zero;

        }

    }

 

    static unsafe void Main(string[] args)

    {

        int bufSize = 1024;

 

        Action<int> a2 = (count) =>

        {

            // 무한 루프를 돌며,

            while (count-- > 0)

            {

                / Native Heap,  -관리 힙으로부터 배열 메모리 할당

                using (NativeMemory<intbuf = new NativeMemory<int>(bufSize))

                {

                    Span<int> viewBuf = buf.GetView();

                    viewBuf[0] = 0;

                    viewBuf[bufSize - 1] = 0;

                }

            }

        };

    }