일반적으로 나는 "조기 최적화"라는 단어를 싫어하지만,이 문제는 심각합니다. Knuth goto
가 중요한 영역의 코드 속도를 높이기 위해 명령문 을 사용하도록 추진하는 맥락 에서이 유명한 인용문을 사용했다는 점은 주목할 가치가 있습니다. 이것이 핵심입니다. 중요한 길.
그는 goto
코드 속도를 높이는 데 사용할 것을 제안 했지만 중요하지 않은 코드에 대한 미신과 미신을 기반으로 이러한 유형의 작업을 수행하려는 프로그래머에게는 경고했습니다.
Knuth가 "최적화 및 파운드 어리 석음"프로그래머라고 부르는 전형적인 예는 코드베이스 전체에서 switch
가능한 한 균일하게 진술 을 선호 하는 것입니다. "파운드 이상으로 동전을 절약하려고 시도한 결과 디버깅 악몽으로 바뀌는 코드입니다. 이러한 코드는 처음부터 효율적일뿐 아니라 유지 보수가 거의 불가능합니다.
그가 맞습니까?
그는 매우 기본적인 효율성 관점에서 옳습니다. 내가 아는 컴파일러는 스위치 문보다 객체 및 동적 디스패치와 관련된 다형성 코드를 최적화 할 수 없습니다. 다형성 코드에서 인라인 코드로의 LUT 또는 점프 테이블로 끝나지 않을 것입니다. 이러한 코드는 컴파일러의 최적화 장벽으로 사용되는 경향이 있기 때문에 (동적 디스패치 시점까지 어떤 함수를 호출해야하는지 알 수 없습니다) 발생).
이 비용을 점프 테이블의 관점에서 생각하지 않고 최적화 장벽의 관점에서 더 많이 생각하는 것이 더 유용합니다. 다형성의 경우 호출을 Base.method()
사용하면 컴파일러 method
가 가상이 아니고 봉인되지 않고 재정의 될 수 있는 함수가 실제로 호출되는 것을 알 수 없습니다. 실제로 어떤 함수가 미리 호출되는지 알지 못하므로 함수 호출을 최적화하고 최적화 결정을 내리는 데 더 많은 정보를 활용할 수는 없습니다. 실제로 어떤 함수가 호출 될지 알 수 없기 때문입니다. 코드가 컴파일되는 시간
옵티마이 저는 함수 호출에 피어링하고 발신자와 수신자를 완전히 평평하게하거나 최소한 수신자를 최적화하여 수신자와 가장 효율적으로 작업하도록 최적화 할 수 있습니다. 어떤 함수가 실제로 미리 호출 될지 모른다면 그렇게 할 수 없습니다.
방금 엉덩이를 말하는거야?
일반적으로 페니에 해당하는이 비용을 사용하여이를 균일하게 적용되는 코딩 표준으로 바꾸는 것을 정당화하는 것은 일반적으로 매우 어리석은 일입니다. 특히 확장 성이 필요한 곳에서는 더욱 그렇습니다. 이것이 진정한 조기 옵티 마이저에서주의해야 할 주요 사항입니다. 유지 보수성에 관계없이 사소한 성능 문제를 코드베이스 전체에 균일하게 적용되는 코딩 표준으로 바꾸려고합니다.
그래도 그 중 하나이기 때문에 받아 들여진 대답에 사용 된 "오래된 C 해커"인용문에 약간의 위반이 있습니다. 매우 제한된 하드웨어에서 시작하여 수십 년 동안 코딩을해온 사람이 모두 조기 최적화 프로그램이 된 것은 아닙니다. 그러나 나는 그들과도 만나서 함께 일했습니다. 그러나 이러한 유형은 분기 오판 또는 캐시 미스와 같은 것을 측정하지 않으며, 그들이 더 잘 알고 있다고 생각하며 오늘날에는 적용되지 않는 미신에 기반한 복잡한 프로덕션 코드베이스에 비 효율성이라는 개념을 기반으로하며 때로는 결코 참지 않습니다. 성능이 중요한 분야에서 진정으로 일한 사람들은 효과적인 최적화가 효과적인 우선 순위 지정이라는 사실을 잘 알고 있으며, 페니를 절약하기 위해 유지 보수성 저하 코딩 표준을 일반화하는 것은 매우 비효율적 인 우선 순위 지정입니다.
페니는 매우 빡빡하고 성능이 중요한 루프에서 10 억 번 호출되는 일을 많이하지 않는 저렴한 기능을 사용할 때 중요합니다. 이 경우 1,000 만 달러를 절약하게됩니다. 몸만으로도 수천 달러의 비용이 드는 기능을 두 번 호출하면 페니를 면도 할 가치가 없습니다. 자동차를 구매하는 동안 시간을 낭비하는 것이 현명하지 않습니다. 제조업체에서 백만 캔의 음료수를 구입하는 경우 페니를 넘겨 볼 가치가 있습니다. 효과적인 최적화의 핵심은 적절한 비용으로 이러한 비용을 이해하는 것입니다. 구매할 때마다 돈을 절약하려고 노력하는 사람은 다른 사람이 구매하는 제품에 관계없이 돈을 벌려고 시도하는 것이 숙련 된 최적화 프로그램이 아니라고 제안합니다.