2009-08-11 4 views
3

세 개의 객체를 함수에서 가져와야 할 때, 필자의 본능은 세 가지 참조를 반환하는 새로운 유형을 만드는 것입니다. 또는 ref가 같은 유형이라면 배열을 사용할 수 있습니다. 그러나 패스에 의해-REF는 쉽게 :이이 잘못된 것은 분명히 아니다하지만 대부분은 내가 미학과 psycholgical 바이어스의 이유로 생각,이 방법을 사용하는 것을 주저래퍼 유형 대 패스 유형 매개 변수의 긴 목록


     private void Mutate_AddNode_GetGenes(ref NeuronGene newNeuronGene, ref ConnectionGene newConnectionGene1, ref ConnectionGene newConnectionGene2) 
     { 

     } 

. 실제로 이러한 접근법 중 하나를 다른 접근법보다 유용하게 사용할만한 이유가 있습니까? 추가 래퍼 객체를 만들거나 매개 변수를 스택에 푸시하는 것이 성능 문제 일 수 있습니다. 필자의 경우에는 CPU 집중 형 코드입니다. CPU주기가 중요합니다.

C# 3 방식의 좀 더 우아한 C# 2가 있습니까?

감사합니다.

답변

3

거의 모든 컴퓨팅 문제에 대해 CPU 차이를 알 수 없습니다. 샘플 코드에는 "Gene"이라는 단어가 있기 때문에 실제로 드문 코드 범주에 속할 수 있습니다.

다른 개체를 래핑하기 위해 개체를 만들고 파괴하면 약간의 성능이 필요합니다 (생성해야하며 가비지 수집이 필요합니다).

미적으로 관련없는 객체를 그룹화하기 위해 객체를 만들지는 않겠지 만, 논리적으로 함께 있으면 포함하는 객체를 정의하는 것이 완벽합니다.

+2

PS - 스택에서 데이터를 관리하는 것이 힙의 데이터를 관리하는 것과 비교하여 매우 효율적입니다. –

+1

@ 에릭 (Eric), 대답에 그 주석을 쓰지 않는 이유는 무엇입니까? –

+0

사실 이후에 덧글을 추가하는 것이 빠르기 때문에? 내가 의견을 게시하기보다는 답변을 편집하는 것을 인식하지 못하는 이유가 있습니까? –

1

랩핑 유형 (IMHO)의 성능에 대해 걱정할 경우 구조체를 사용해야합니다. .NET의 현재 32 비트 구현 (및 상향 64 비트 4.0)은 많은 경우 구조체를 인라인/최적화하여 지원하므로 구조체와 ref 인수 사이에 성능 차이가 전혀 없음을 알 수 있습니다.

1

두 옵션의 상대적 실행 속도가 걱정되는 것은시기 상조입니다. 알고리즘을 먼저 올바르게 수정하고 깨끗하고 유지 보수가 가능한 코드를 만드는 데 집중하십시오. 완료되면 프로파일 러를 실행하여 CPU 시간의 80 %를 차지하는 코드의 20 %를 최적화 할 수 있습니다. 이 방법이 20 %에 달하는 경우에도 두 가지 호출 스타일의 차이는 등록하기가 적을 것입니다.

그래서 성능 문제는 제쳐두고, 저는 컨테이너 클래스를 사용합니다. 이 메서드는 세 개의 매개 변수 만 사용하고 각 매개 변수는 (아마도) 수정되므로 ref 매개 변수 대신 세 개의 멤버 변수를 사용하여 컨테이너 클래스의 메서드로 사용할 수 있습니다.