2016-08-12 2 views
1

성능 현명한이 일에 어떤 차이가이정적 클래스

public static Class StaticTestClass() 
{ 
    public static void Function(object param) => //Do stuff with "param" 
} 

이를? : :

public Class ConstructedTestClass() 
{ 
    private object classParam; 
    public ConstructedTestClass(object param) 
    { 
    classParam = param; 
    } 
    public void Function() => //Do stuff with "classParam" 
} 

내가 어떤 성능 differece가 없을 것이라고 생각 한 번만 해봐도 여러 번 반복해야한다면 Function() 번을 여러 번 전화할까요?

ConstructedTestClass의 많은 인스턴스가 메모리에 영향을 줍니까?

매개 변수가있는 StaticTestClass을 사용하여 Function을 호출하면 성능에 어떤 영향이 있습니까?

추신 : 이와 비슷한 질문이 있지만 많은 호출시 성능을 중시하는 것을 찾을 수 없습니다.

편집 : 나는 몇 가지 테스트를하고이 결과를 다음과 같습니다

1000000000으로 반복하고 ConstructedClass 각 반복 만들기.

정적 방법 : 72542ms

구축 방법 : 정적 방법 빠르다 이때 83579ms

, 그때마다 Function() 호출하는 클래스를 생성하지했는데,이 결과는 다음과 같다 : 100000000 samples]

정적 방법 : 7203ms

구축 방법 : 7259ms

이 경우에는 거의 차이가 없으므로 클래스의 인스턴스를 1000000000 개 생성 할 것이므로 가장 좋아하는 것은 무엇이든 할 수 있다고 생각합니다.

+0

당신은 * 여러 번 말 했어요.하지만 몇 개죠? 차이를 만드는 것은 너무 많지 않을 수 있습니다. 두 가지 접근법을 비교해보고 싶으 시다면'Stopwatch' 클래스를 사용하여 시간을 측정하십시오. – user3185569

+0

쉽게 중복 될 수있는 유사한 질문이 많이 있습니다. 그러나 더 중요한 것은 *** 당신이 실제로 코드에 윤곽을 잡아서 문제의 차이가 충분한 지 알았습니까? *** 내 추측은 당신이 그랬다면 당신이 그랬을 때 그 차이가 너무 작아서 찾을 수 없었을 것입니다. 정확하게 측정하는 것은 거의 불가능합니다. 이 수준의 마이크로 최적화에 대한 걱정보다 적절한 애플리케이션을 설계하는 것이 훨씬 낫습니다. –

+0

당신의 말을 경주하십시오! :) https://ericlippert.com/2012/12/17/performance-rant/ – NoSaidTheCompiler

답변

2

기술적으로 그렇습니다. 정적 메서드는 인스턴스화 되었기 때문에 첨부 된 개체가 있는지 확인하고 확인할 필요가 없으므로 호출 당 약간 더 빠릅니다. 이것은 뒤에서 발생합니다. (기술적으로 객체를 설정하는 데 약간의 오버 헤드가있을 것입니다.)

이것은 대부분의 상황에서 다른 하나를 선택하는 것은 정말 좋은 이유는 아닙니다. 그들은 다른 목적을 가지고 있습니다. 정적 메소드는 객체 캔 등의 내부 변수의 상태를 유지할 수 없습니다.

나는 아마도 정적 메서드를 선택합니다. 표시 한 코드를 기반으로 할 일을하고 싶은 객체에 대한 참조를 유지할 필요가 없습니다. 기능을 수행하고 그 기능을 수행하십시오.

다른 방법을 사용하면 개체를 만들어야하고 메서드를 호출해야합니다. 또한 설정 방법은 메소드가 작동하는 개인 변수에 저장된 참조가 있으므로 액션을 수행해야하는 각 대상 객체에 대해 새 객체를 인스턴스화해야합니다. 나에게 이것은 가독성 측면에서 더 혼란 스러울 것이다.

1

한 가지 차이점은 생성 된 개체를 가비지 수집해야한다는 것입니다. 정적 호출에서는 오버 헤드가 발생하지 않습니다.

  • 정적 버전이 얻어 ~ 0.7 초
  • 비 정적 버전 (인스턴스 한번 만들고있어서 N 번 호출) 소요 ~ 0.7 초 :

    난 100000000 반복 위해 테스트.

  • 비 정적 버전 (호출 당 인스턴스 하나 생성)은 ~ 1.4 초가 걸립니다.
+0

함수 호출은 가비지 수집의 영향을받지 않습니다. 사실, 응용 프로그램의 수명 동안 동일한 인스턴스에서 함수를 호출 할 수 있습니다. –

+0

생성자로 전달 되었기 때문에 매개 변수가 변경된 경우 아닙니다. – JanDotNet

+0

나는 스스로 테스트를하고 있는데, 질문을 편집하고 결과를 게시 할 것이다. – null