2009-12-14 5 views
3

비 정적 방법보다 정적 방법의 성능 문제는 무엇입니까? Static 메서드는 성능 측면에서 더 뛰어나다는 것을 알고 있지만, 알고 싶습니다. 어떻게 속도가 더 빠릅니까? 메소드가 인스턴스 멤버를 사용하지 않으면 컴파일러가이를 처리하고 정적 메소드로 처리해야합니다.C#의 정적 메서드?

답변

7

편집 : 에릭 참고 있지만 ...이 here에 대한 논평 및 call 사용 몇 번이 있다는 것을 암시하는 원래 컴파일러에서 자신의 new() 예를 isn't guaranteed ;-p


(1.1 이전), 컴파일러 이 아닌 가상 인스턴스 메서드 (this 제외)를 정적으로 처리했습니다. 문제가 확인 null 일부 홀수 문제점이 리드, 즉

obj.SomeMethod(); 

하지은 (obj=null 아닌 가상 this을 터치하지 않은 방법 SomeMethod 용) 예외를 던진 한 것이었다. SomeMethod의 구현을 변경 한 경우 좋지 않습니다. 그들이 명시적인 널 검사 (null-check, static-call)를 추가하는 비용을 조사했을 때 가상 호출을 사용하는 것과 똑같은 것으로 판명되었으므로 대신 가상 호출을 사용하여 유연성과 유연성을 높였습니다. 예측할 수있는.

SomeMethod이 확장 메서드 (정적) 인 경우 "예외를 throw하지 않음"도 동작합니다.

나는 어느 시점에서 일반 정적 호출을 통해 인스턴스 메서드를 호출 할 수 있다고 생각하지만 마지막으로 시도한 "오, 안돼!" CLR의 메시지 (이 작업으로 인해 런타임이 불안정해질 수 있음). 그들은 이걸 완전히 막았거나, 아마도 내가 커스텀 일리노이를 골랐다. 당신이 정적 멤버를 인스턴스 (instance)를 생성하고 저장하는 경우 인스턴스를

구매를 구성하기 때문에

+0

저는 C++ 컴파일러가 이것을 읽었으므로 왜 C# 컴파일러를 만들지 않았을까요? – viky

+0

그것은 똑똑하지 않습니다 ... 내가 설명한 것처럼 "null 체크와 정적 호출"vs "가상 호출"(널 체크가 내장되어 있음) 사이에는 눈에 띄는 차이가 없었습니다. 그렇다면 왜 두 가지 옵션을 유지해야합니까? –

3

this question을 참조하십시오.

정적 호출이 인스턴스는 인스턴스 메서드를 호출 할 때마다 시간을 구성하는 것보다 4 ~ 5 배 빠른 :

다음은 발췌입니다. 당신이 직접 확인할 수 있지만 그러나, 우리는 여전히, 전화 나 컴파일러가 정적 메서드로 처리됩니다 의심

+2

이것은 각 호출에 대해 새 인스턴스를 생성하는 것과 비교됩니다. 여러 번의 호출을 위해 인스턴스를 생성하는 일반적인 경우를 비교하지 않습니다. –

+3

다른 질문의 답을 * 참고하기 만하면 * 링크를 코멘트로 게시하거나 복제본으로 투표하는 것이 어떻습니까? –

+1

또한이 기사는 2003 년에 돌아 왔음에 유의하십시오. CLR은 그 이후로 상당히 변경되었습니다. –

1

당 나노초의 수십에 대해 을 이야기하고 있습니다. 이점은 인스턴스를 만들지 않을 것입니다. 걱정할 가비지 컬렉터가 없습니다. 정적 생성자 만 호출하면됩니다.

+0

C++ 컴파일러가 그 이유는 무엇입니까? .NET (C#) 컴파일러 – viky

0

정적 메소드 빠르고, 성능은

때문에 전체 성능에 매우 작은

같다 ... ....

5

예 정적 호출이 더 빠를 것입니다. 메서드를 호출하기 전에 개체의 인스턴스를 만들 필요가 없습니다. (비록 분명히 차이점을 알지는 못하지만)

컴파일러가 메소드를 최적화하면 (인스턴스 메소드를 정적으로 만든다.) 인스턴스 메소드를 호출하지 않아도된다. 이미 인스턴스를 만들었지, 그렇지?

하루가 끝나면 여기 저기에 3 나노초를 저장하는 대신 유지 보수성을 위해 코드를 최적화해야합니다.

+0

C++ 컴파일러처럼 C# 컴파일러가이 최적화를 수행 할만큼 똑똑 할 수 있기를 바랍니다. 설명 주셔서 감사합니다 !! – viky

0

예 정적 메서드는 빠르지 만 정적 변수로 얻은 메모리는 GC로 제어되지 않으며 필요하지 않은 경우에도 해제되지 않으므로 문제가됩니다.

하지만 메모리와 속도가 증가하여 allpication의 디자인을 고려해야 만하지만 정적 변수를 제대로 사용하지 않으면 디자인이 엉망이 될 수도 있습니다.

+0

정적 메서드를 호출하기 위해 정적 변수가 필요하지 않습니다. 그들은 서로 다른 개념입니다. –