최신 리팩터링 라운드에서 많은 수의 템플릿 클래스를 가변 개수의 템플릿 인수로 바꾼 버전으로 대체했습니다. 특정 성능 테스트 케이스가 약 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
정말 빈 클래스입니까? 아니면 단순화? –
@ DavidRodríguez-dribeas : 단순화. 유일한 변화는 가변적 인 템플릿 선언으로의 전환이라는 것을 분명히하고 싶었습니다. 나머지 코드는 변경되지 않았으며 클래스의 가변 버전과 비 가변 버전 사이의 차이에 대해 알지 못합니다. – bluescarni
나머지 코드가 "변경되지 않은"상태로 유지되면 누군가가 'U'라고 말할 때마다 깨지 않을 것입니까? –