2012-06-26 2 views
0

저는 C++에서 제 머리를 감싸려고 노력하는 C++ 프로그래머입니다. 배열을 선언하려면 New 연산자를 사용해야합니까? 가비지 수집기가 관련되지는 않을까요?C# 배열과 가비지 컬렉터에 비해 C# 배열

해당 함수 내에서만 사용할 배열을 만들고 프레임 당 수천 번 호출되는 함수가있는 경우 New 연산자에 대한 모든 호출이 가비지 수집기에 대한 상당한 오버 헤드를 생성하지는 않습니다 ?

C++에서는 함수가 끝나고 성능 오버 헤드가 줄어들지 만 스택에서 선언 된 배열이되지만 성능 오버 헤드는 최소화되지만 C#에서는 가비지 수집기의 성능이 얼마나 걸릴지 걱정됩니다 이 경우.

나는 올바른 생각을하고 있습니까? 여기 가비지 컬렉터가 관련되어 있으며 문제를 일으킬 수 있습니까? 더 나은 "C# 방식"이 있나요?

+0

GC는 필요한 경우에만 호출됩니다. 함수 호출 후에 호출되지 않습니다. – zerkms

+1

'new'에 대한 모든 작은 호출은 실제로 오버 헤드를 추가합니다. 그러나 가비지 수집기는 메서드가 종료 될 때마다 실행할 필요가 없습니다. 가비지 수집은 "한 번만"실행됩니다. 그러나 이것이 정말로 문제가된다면 배열을 클래스 멤버로 만들어 재사용 할 수 있도록하십시오. –

+0

나는 이것을 테스트 한 결과 나는 옳았다. New 연산자에 대한 프레임 당 1000 건의 호출은 GC에서 엄청난 오버 헤드를 발생시킵니다. 프로파일 링하여 GC가 프레임의 87 %를 차지하고 프레임 속도를 ~ 60에서 ~ 30으로 떨어 뜨린 것을 발견했습니다. – Mloren

답변

0

기본적으로 가비지 수집기에 대해 걱정할 필요가 없습니다. 실제로 수행중인 작업을 알고 있으므로 실제로 잘 수행 할 수 있습니다. 당신은 이미지 물건을 수행하는 경우

, 다음 네, 당신이 stackalloc에게 http://msdn.microsoft.com/en-us/library/cx9s2sy4.aspx

을 사용할 수 있습니다 예를 들어 당신은 ... 당신이 비록이 문제를 해결 단계 수있는 문제로 실행할 수 있지만, 코드가 설정되어야 할 것이다 의미 "안전하지 않은".

int* frameData; 
frameData = stackalloc int[200]; 
+0

감사합니다.이 방법이 유일한 방법 일 것입니다. – Mloren

+0

같은 버퍼를 재사용하는 것 외에는. –

+0

@Mloren, 테스트 할 때 "대형 객체 힙"(LOH) 동작에 대해 확인하십시오. 80K + 어레이를 할당하면 더 작은 어레이에 비해 다른 bafavior를 얻을 수 있습니다. 마이그레이션에 대한 고통 : C# 배열은 int [234]보다 stl :: vector에 가깝습니다. –

관련 문제