2014-05-11 3 views
1

내 코드에서 Print을 자주 호출한다고 가정합니다.함수를 사용한 변수 최적화

글로벌 변수 또는 로컬 변수로 CurrentPosition을 선언해야합니까?

빠른 버전을 알고 싶습니다.

옵션 A :

int CurrentPosition = 0; 
    void Print(string key, int conc, int col, byte _color) { 
     if (col <= cMax ? col >= cMin : false) { 
      if (CurrentRows.TryGetValue(key + "#" + conc.ToString(), out CurrentPosition)) { //Row is in the vieport 
       grid.GetCell(CurrentPosition, col).Presenter.Background = new SolidColorBrush(Color.FromRgb(255, 255, 0)); 
      } 
     } 
    } 

옵션 B :

void Print(string key, int conc, int col, byte _color) { 
    int CurrentPosition = 0; 
     if (col <= cMax ? col >= cMin : false) { 
      if (CurrentRows.TryGetValue(key + "#" + conc.ToString(), out CurrentPosition)) { //Row is in the vieport 
       grid.GetCell(CurrentPosition, col).Presenter.Background = new SolidColorBrush(Color.FromRgb(255, 255, 0)); 
      } 
     } 
    } 
+0

왜'col <= cMax? '를 사용합니까? col> = cMin : false> 대신'col <= cMax && col> = cMin'? '&&'는 단락 할 것이다. –

+0

'out' 매개 변수로 전달되는 경우 왜 변수에'= 0'을 할당합니까? 그 '0'덮어 씁니다. –

+0

여기가 작은 세부 사항이라고 생각합니다. 어쨌든'int' 타입의 기본값은 0입니다. 이것은 out 매개 변수없이 모든 경우에 중복됩니다. – ZenLulz

답변

1

C# 컴파일러가이 두 가지 옵션을 처리하는 방법을 알고 싶습니다.

의 나는이 단순한 클래스가 있다고 가정 해 봅시다 :

class Test 
{ 
    private int _currentPosition; 

    public int OptionA() 
    { 
     ImplOutParameter(out _currentPosition); 
     return _currentPosition; 
    } 

    public int OptionB() 
    { 
     int currentPosition; 
     ImplOutParameter(out currentPosition); 

     return currentPosition; 
    } 

    public void ImplOutParameter(out int position) 
    { 
     position = 1; 
    } 
} 

두 첫번째 방법은 당신과 매우 유사하다. 세 번째는 out 매개 변수 구현을 테스트하는 것입니다.

릴리스 구성으로이 클래스를 컴파일 해 봅시다.그것은 변수 멤버의 참조를 얻을하고 ImplOutParameter 메소드를 호출 두 번 스택에 객체의 참조를 밀어

Method OptionA

:처럼 좋아하는 IL 뷰어를 사용하여 방법 OptionA 보인다. 그런 다음 변수 멤버의 값을 반환합니다.

Method OptionB

그것은 스택상의 오브젝트 레퍼런스 푸시 스택 변수의 어드레스를 푸시하고 반환 method.Then ImplOutParameter를 호출처럼

메소드 OptionB 보인다 가치. 변수를 할당하기 위해 시간이 필요하지 않습니다.

이 분석을 바탕으로, 나는 OptionB 구현이 첫 번째 것보다 조금 더 빠르다고 말하는 경향이 있지만, 이것은 매우 작습니다. :)

+0

(이 주석은 질문에서 물어 본 것 이상입니다.) 동시에 하나의 메소드 내에서만 로컬로 사용되는 변수가 클래스 수준 필드로 "승격"되기 때문에 옵션 A는 읽기가 매우 어렵습니다. 또한 메모리에 상주하는'Test'의 모든 인스턴스는 메서드가 호출되지 않아도 필드를 보유한다는 것을 의미합니다. –

+0

@JeppeStigNielsen 예, 맞습니다.이 글은 약간 이상합니다. 그럼에도 불구하고, 나는 이것이 OP의 경우라고 가정합니다. 물론 OptionA는 메모리를 절약하는 최적의 방법은 아니지만이 방법이 두 번째 방법보다 빠르다는 것을 확인하는 것은 흥미 롭습니다. :) – ZenLulz

1

당신이 전화 당신이 통과하지 않는 사이에 CurrentPosition상태를 유지하는 경우 값을 메소드에 넣으면 외부에 있어야합니다. 그렇지 않으면 매번 새로운 것이 시작됩니다.

정책은 CurrentPosition을 매개 변수로 메서드에 전달하고 루틴의 코드와 독립적 인 상태를 유지하는 세 번째 옵션입니다.

속도면에서 볼 때 할당에는 약간의 시간이 걸리지 만 일반적으로 무시할 수 있습니다. "스택 프레임"은 관계없이 길어지고 기본값 할당은 할당만큼 오래 걸립니다.

따라서 가장 많이 저장하게되는 것은 호출 당 2 사이클 (즉, 나노 초)이지만, 외부에 있다고 선언하면 더 빨리 처리 할 수 ​​있습니다.

+0

저는 CurrentPosition의 상태를 유지하지 않습니다. 나는 어떤 버전이 더 빠른지 알고 싶다. – user72708

+0

아. 이 경우 외부에 선언 할 수있는 작은 (그러나 작은) 가장자리가있을 수 있습니다. 답변을 업데이트합니다. –

0

어떤 것이 더 빠르는지 알고 싶다면 테스트하십시오. 그것이 정말로 확실한 유일한 길입니다.

성능을 기준으로 선택할 방법을 결정할 때는 항상 성능을 테스트하십시오. 테스트 할만한 가치가없는 경우 여분의 사이클이 필요하지 않습니다.

즉, 두 가지 방법은 기능적으로 다르므로 결정이 속도에 기반하지 않아야합니다. Option B는 Print가 호출 될 때마다 CurrentPosition을 설정하고, Option A는 CurrentPosition을 0으로 설정하고 Print가 호출 될 때의 값은 [i] 0이 아니므로 [/ i] 보장하므로 올바른 기능을 제공하는 옵션을 선택해야합니다.

다른 속도는 거의 무시할 만하다는 사실을 알 수 있습니다. 실제로는이 두 가지 사이에 존재하지 않을 수 있습니다.