최적화를 로컬로 유지하고, 명확하게하고, 문서화하고, 최적화하고 소스 코드와 런타임 성능 측면에서 최적화되지 않은 버전과 최적화되지 않은 버전을 쉽게 비교할 수 있도록합니다.
전체 답변
이러한 최적화가 정말 경우 입니다 제품 중요, 당신은 최적화 전에 유용했다뿐만 아니라 이유를 알고 있지만, 또한 미래에 도움이 될 것입니다 여부를 알 도움말 개발자에게 충분한 정보를 제공해야합니다.
이상적으로는 성능 테스트를 빌드 프로세스에 포함시켜야하므로 새로운 기술이 오래된 최적화를 무효화하는시기를 알 수 있습니다.
생각해 내다:
프로그램 최적화의 첫 번째 규칙 :하지 마십시오.
프로그램 최적화의 두 번째 규칙 (전문가에게만 해당) : 아직하지 마십시오. "
— 마이클 에이 잭슨
지금 이 시간 인지 알기 위해서는 벤치마킹 및 테스트가 필요합니다.
언급했듯이, 최적화 된 코드의 가장 큰 문제는 가능한 한 유지하기가 어렵다는 것입니다. 가능한 한 최적화 된 부분을 최적화되지 않은 부분과 분리해야합니다. 컴파일 타임 링크, 런타임 가상 함수 호출 또는 그 사이의 무언가를 통해이 작업을 수행하든 상관 없습니다. 중요한 것은 테스트를 실행할 때 현재 관심있는 모든 버전 에 대해 테스트 할 수 있기를 원한다는 것입니다.
프로덕션 코드의 기본 최적화되지 않은 버전을 사용하여 항상 코드의 의도 를 이해하는 데 사용할 수있는 방식으로 시스템을 구축 한 다음 최적화 된 버전을 포함하여 다른 최적화 된 모듈을 빌드하여 어디서나 명시 적으로 문서화하는 경향이 있습니다. 최적화 된 버전은 기준과 다릅니다. 테스트 (단위 및 통합)를 실행할 때 최적화되지 않은 버전 과 모든 현재 최적화 된 모듈에서 테스트를 실행합니다 .
예
예를 들어 고속 푸리에 변환 기능 이 있다고 가정 해 봅시다 . 에 기본 알고리즘 구현 fft.c
및 테스트가있을 수 fft_tests.c
있습니다.
그런 다음 Pentium이 나오고 MMX 명령어 를 fft_mmx.c
사용하여 고정 소수점 버전을 구현하기로 결정합니다 . 나중에 펜티엄 3이 나오고 에서 스트리밍 SIMD 확장 을 사용하는 버전을 추가하기로 결정 했습니다 .fft_sse.c
이제 CUDA 를 추가하려고 하므로을 추가 fft_cuda.c
하지만 몇 년 동안 사용해온 테스트 데이터 세트를 사용하면 CUDA 버전이 SSE 버전보다 느립니다! 몇 가지 분석을 수행하고 100 배 더 큰 데이터 세트를 추가하면 예상 속도가 향상되지만 CUDA 버전을 사용하기위한 설정 시간이 중요하고 작은 데이터 세트를 사용하면 데이터 세트를 사용해야합니다. 설정 비용이없는 알고리즘.
이러한 각 경우에 동일한 알고리즘을 구현하는 경우 모두 동일한 방식으로 작동해야하지만 서로 다른 아키텍처에서 전혀 다른 효율성과 속도로 실행됩니다 (모두 실행될 경우). 그러나 코드 관점에서 소스 파일 쌍을 비교하여 동일한 인터페이스가 다른 방식으로 구현 된 이유를 찾을 수 있으며 일반적으로 가장 쉬운 방법은 최적화되지 않은 원래 버전을 다시 참조하는 것입니다.
최적화되지 않은 알고리즘을 구현하는 기본 클래스와 파생 클래스가 다른 최적화를 구현하는 OOP 구현도 마찬가지입니다.
중요한 것은 같은 일 유지하는 것입니다 동일을 너무 것을, 차이가 분명하다 .