2013-09-24 2 views
2

최신 리팩터링 라운드에서 많은 수의 템플릿 클래스를 가변 개수의 템플릿 인수로 바꾼 버전으로 대체했습니다. 특정 성능 테스트 케이스가 약 20-30 %의 성능 저하를 보았다는 사실을 알기에는 상당히 의아해했습니다.variadic 템플릿의 성능 영향

나중에 약간의 양방향 왕복이 발생하면 문제가되는 커밋이 확인되었습니다. 말 그대로 내가이 하나의 변화를 적용하는 것은 위에서 언급 한 둔화를 생산하는 것을 실험적으로 확인했다

template <typename T, typename ... Args> 
class foo {}; 

template <typename T, typename U> 
class foo {}; 

에서 하나의 변화로 구성되어 있습니다. 더 수수께끼로, GCC 4.7에서 GCC 4.8로 컴파일러 버전을 전환하면 다른 유사 커밋 (즉, 고정 인수에서 가변 인수로의 다른 전환이지만 다른 클래스 bar)으로 감속 발생이 이동합니다.

약간의 컨텍스트를 제공하기 위해이 특정 성능 테스트 사례는 메모리 바인딩 된 매우 희소 한 컴퓨터 대수 문제이므로 효율적인 캐시 메모리 사용에 매우 취약합니다. 이 테스트 케이스는 항상 내 코드에서 문제가되는 부분이었습니다 (예 : 최대 성능을 추출하기 위해 캐시 라인 크기 감지를 관리하는 컴파일러 옵션을 수동으로 조정해야했던 GCC 4.4/4.5와 같은).

아무도이 동작을 일으킬 수있는 아이디어가 있습니까? 불행하게도, 축소 된 테스트 케이스 추출은 매우 어려울 수 있습니다. 참고로

편집

, 이것은이 좋은 성능 동작을 복원하는 것이 커밋이다. 불행하게도 그것은 (단지 하나의 클래스 대신에) 많은 클래스들을위한 non-variadic 코드로의 복귀로 구성된다. 좀 더 제한적인 예를 생각해 내려고합니다.

https://gitorious.org/piranhapp0x/mainline/commit/b952c613b42fe480fe4ed2dfd3e683eb9e38e4cd

+0

정말 빈 클래스입니까? 아니면 단순화? –

+0

@ DavidRodríguez-dribeas : 단순화. 유일한 변화는 가변적 인 템플릿 선언으로의 전환이라는 것을 분명히하고 싶었습니다. 나머지 코드는 변경되지 않았으며 클래스의 가변 버전과 비 가변 버전 사이의 차이에 대해 알지 못합니다. – bluescarni

+0

나머지 코드가 "변경되지 않은"상태로 유지되면 누군가가 'U'라고 말할 때마다 깨지 않을 것입니까? –

답변

4

그것은 광범위한 질문 일반적인 용의자는 (내가 걱정까지로) 생성 된 코드에서 가변 인자 템플릿 매개 변수의 재귀 처리가되어 있습니다.

가변 매개 변수 템플릿 매개 변수를 사용하는 메서드가 런타임시 컴파일 타임에만 재귀가 발생하는 방식으로 구현되는지 확인해야합니다. 아이디어를 얻으려면 몇 가지 예를 살펴 보시기 바랍니다 (예 : this answer of mine). 재귀는 컴파일 타임에 발생하며 실제 코드는 단일 단계 전달 및 확장입니다. 은 단일 매개 변수 이외의 다른 값을 가질 수 없기 때문에 variadic 템플릿 매개 변수를 갖는 것은 전혀 의미가 없으므로 실제로 코드를 수정해야한다고 생각합니다. 'm wrong;) (귀하의 의견에 따라 매개 변수 팩을 전달하는 코드에서 위와 같은 것을 트리거 할 수 있습니다)

+0

닌자 편집을 위해 죄송합니다. 포인터 주셔서 감사합니다. 약간의 독서를 할 것입니다. 나는 꽤 많이 재귀가 일어나지 않는다는 것을 확신한다. (나는 단지 클래스 템플릿의 모든 상위 계층에 기본 템플릿 인자를 두는 것을 피하려고한다. 기본 클래스에 기본 인자를 만들고 맨 위에 가변 인자를 사용한다.) ,하지만 다시 확인해 볼게. – bluescarni

관련 문제