2010-11-25 9 views
1

이 코드 조각을 고려 : 내가 갈 수실행 시간 차이가 있습니까?


class A { 
    void methodX() { 
    // snip (1 liner function) 
    } 
} 

class B { 
    void methodX() { 
    // same -code 
    } 
} 

이제 다른 방법입니다, I 클래스 (AppManager를)가 대부분의 구성원 정적의 (레거시 코드에서, 나에게 싱글을하지 않는 것이 좋습니다))


class AppManager { 
    public: 
    static void methodX(){ 
    // same-code 
    } 
}

어떤 것을 선호해야합니까? 둘 다 인라인되기 때문에 런타임에 차이가 있어서는 안됩니다. 맞습니까?
어떤 형태가 더 깨끗합니까?

+0

컴파일러 최적화는 가장 낮은 레벨에서 가장 잘 작동하지만 가장 높은 레벨에서 완전히 실패합니다 (즉, "현재 작업에 가장 적합한 알고리즘입니까?"). 따라서 컴파일러가이 수준이 아닌 수준에서 최적화해야합니다. – MSalters

답변

6

우선,이 기능은 프레임 당 수천 번 호출되지 않으면 (그리고 "프레임"이 중요한 부분을 수행하는 경우가 아니면) 걱정할 필요가 없을 정도로 소극적입니다.

두 번째로, 코드가 인라인 된 경우 코드가 (너무나 잘) 최적화되어 비 정적 인 함수의 서명이 전혀 없습니다. 그것은 동일 할 것이다.

인라인되지 않은 경우에도 차이는 미미합니다. ABI는 "this"포인터를 정적 함수에서는 수행하지 않는 레지스터 (또는 스택)에 넣을 것이지만, 다시 말하면 net 결과는 거의 측정 할 수 없습니다.

결론 - 가장 명확한 방법으로 코드를 작성하십시오. 이 시점에서 성능은 문제가되지 않습니다.

+0

+1 좋은 조언. 유지 보수 가능한 코드는 나중에 언제나 최적화 될 수 있습니다. – ereOn

0

제 의견으로는 인라인 방식이 더 빠를 것입니다. 인라인 함수는 컴파일 타임에 코드에서 대체되므로 레지스터를 저장하고 함수를 호출 한 다음 다시 돌아올 필요가 없습니다. 하지만 정적 함수를 호출하면 함수 호출 일 뿐이며 인라인 함수보다 많은 오버 헤드가 발생합니다.

+0

정적 함수도 인라인 될 수 있습니다. – EboMike

+0

@ebomike : 정적 인라인을 사용하는 경우! 질문은 정적과 인라인 간의 차이를 원합니다. –

+0

질문은 "둘 다 인라인 된 것처럼"말했습니다. – EboMike

0

이것이 가장 일반적인 최적화 문제라고 생각합니다. 컴파일러가 코드를 잘 최적화 할 수없는 경우 컴파일러에 도움이 될 모든 트릭을 코드를 작성할 때 첫 번째 단계에서는 이미 가지고 있습니다. 이것은 잘못된 것입니다. 코드 작성 중 최적화의 첫 번째 단계에서 찾고있는 것은 깨끗하고 이해하기 쉬운 코드, 디자인 및 구조입니다. 이는 훨씬 더 나은 코드로 손으로 "최적화"됩니다.

규칙은 다음과 같습니다
당신은 최적화 된 코드를 필요로하지 않는 것보다 당신이 벤치 마크 코드 자원이 그것을 재 작성 및 최적화를 위해 많은 시간을 낭비하지 마십시오. 대부분의 경우 코드를 잘 구성하면 모든 종류의 최적화 속도 향상을 얻는 것이 어렵습니다.