문제

큰 데이터 세트를 처리하는 고성능 방법을 작성하고 싶다고 가정 해 봅시다. 개발자가 C 또는 C ++로 이동하는 대신 수동 메모리 관리를 켜는 능력이 없어야하는 이유는 무엇입니까?

void Process()
{
    unmanaged
    {
        Byte[] buffer;
        while (true)
        {
            buffer = new Byte[1024000000];

            // process

            delete buffer;
        } 
    }   
}
도움이 되었습니까?

해결책

메모리 블록을 수동으로 삭제할 수있는 동안 여전히 참조가있을 수있는 동안 메모리 블록을 삭제할 수 있으므로 (런타임은 GC 사이클을 수행하지 않고는 매달려있는 포인터를 생성 할 수 있다는 것을 알 수있는 방법이 없습니다. 메모리 안전. GC 언어는 일반적으로 디자인 별 메모리 안전입니다.

즉, C#에서 특히 원하는 것을 할 수 있습니다.

void Process()
{
    unsafe
    {
        byte* buffer;
        while (true)
        {
            buffer = Marshal.AllocHGlobal(1024000000);

            // process

            Marshal.FreeHGlobal(buffer);
        } 
    }   
}

C/C ++에서와 같이 C#의 원시 포인터 유형에 대한 전체 포인터 산술이 있습니다. buffer[i] 또는 buffer+i 유효한 표현입니다.

다른 팁

고성능과 세부 제어가 필요한 경우 C 또는 C ++에서 수행하는 작업을 작성해야 할 수도 있습니다. 모든 언어가 모든 것에 좋은 것은 아닙니다.

추가로 편집 : 단일 언어가 모든 것에 좋지는 않습니다. 모든 유용한 프로그래밍 언어에 유용한 기능을 모두 추가하면 불일치를 피할 수 있더라도 C ++보다 훨씬 나빠질 것입니다.

기능은 무료가 아닙니다. 언어에 기능이있는 경우 사람들은 그 기능을 사용할 가능성이 높습니다. 새로운 C# 매뉴얼 메모리 관리 루틴을 배우지 않으면 C#을 충분히 배울 수 없습니다. 컴파일러 팀은 유용한 다른 컴파일러 기능의 비용으로이를 구현할 것입니다. 언어는 C 또는 C ++처럼 구문 분석하기가 어려워서 편집이 느려집니다. (C ++ 남자로서, 나는 우리의 C# 프로젝트 중 하나를 컴파일 할 때 항상 놀랐습니다. 편집은 거의 즉각적으로 보입니다.)

특징은 때로는 예기치 않은 방식으로 서로 충돌합니다. C90은 매트릭 계산에서 Fortran과 함께 할 수 없습니다. 언어로 포인터 산술을 허용하는 경우 그 결과를 받아 들여야합니다.

수동 메모리 관리를 허용하기 위해 C# 확장을 제안하고 몇 가지 경우 유용한 경우에도 유용합니다. 이는 메모리가 별도의 방식으로 할당되어야한다는 것을 의미하며 자동으로 관리되는 메모리에서 수동으로 관리되는 메모리를 알려주는 방법이 있어야합니다. 갑자기, 당신은 복잡한 메모리 관리, 프로그래머가 망칠 가능성이 더 많으며 메모리 관리자 자체가 더 복잡합니다. 모든 경우에 더 많은 합병증과 느린 메모리 관리와 대가로 몇 가지 경우에 중요한 성능을 얻고 있습니다.

스크립팅에서 숫자 크런치에 이르기까지 거의 모든 목적에 적합한 프로그래밍 언어를 가질 수 있지만 그 근처에있는 곳은 아무것도 없습니다. 그 동안, 우리는 하나의 언어 만 사용하는 한계 또는 여러 가지를 배우고 그 사이를 전환하는 데 대한 도전을 기꺼이 받아 들여야합니다.

게시 한 예에서 버퍼를 지우고 재사용하지 않는 이유는 무엇입니까?

.NET 쓰레기 수집기는 더 이상 참조되지 않은 객체를 사용하고 관련 메모리를 적시에 해제하는 데 매우 능숙합니다. 실제로, 쓰레기 수집기에는 특수 힙 (큰 물체 힙)이있어 이와 같은 큰 물체를 넣어서 다루기 위해 최적화됩니다.

또한, 참조가 명시 적으로 해제되는 것을 허용하지 않으면 단순히 메모리 누출과 매달려있는 포인터가있는 수많은 버그를 제거하면 훨씬 안전한 코드가됩니다.

GC가 복사 체계를 사용하여 살아있는 블록의 수에 선형 시간을 소비 할 수 있기 때문에, 명백한 메모리 관리가있는 언어로 수행되지 않은 각 미사용 블록을 개별적으로 자유롭게 해제하는 것은 쓰레기 수집가가 그렇게하는 것보다 더 비쌀 수 있습니다. 각각의 죽은 블록을 처리하지 않고 최근의 블록의 수는 살아 남았습니다.

대부분의 커널이 자신의 스레드를 예약 할 수없는 것과 같은 이유와 같은 이유. 99.99%의 시간이 실제로 필요하지 않기 때문에 그 기능을 노출하면 나머지 시간은 잠재적으로 어리 석고 위험한 일을하도록 유혹 할 것입니다.

정말 좋은 곡물 메모리 제어가 필요하다면 해당 코드 섹션을 다른 것에 쓰십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top