Knuth의 원래 인용문은 goto
핫스팟을 제거하기위한 방법으로 신중하게 선택되고 측정 된 영역에서 사용을 권장하는 논문에서 나왔다는 점은 주목할 가치가 있습니다. 그의 인용문은 goto
중요한 루프의 속도를 높이기 위해 사용 하는 이유를 정당화 하기 위해 추가 한 경고였습니다 .
[...] 다시 말하지만, 이것은 n의 평균값이 약 20이고 검색 루틴이 프로그램에서 약 백만 번 수행되는 경우 전체 실행 속도에서 눈에 띄게 절약됩니다. 이러한 루프 최적화 [사용 gotos
]는 배우기가 어렵지 않으며 제가 말했듯이 프로그램의 작은 부분에만 적합하지만 종종 상당한 비용을 절감합니다. [...]
그리고 계속 :
오늘날 많은 소프트웨어 엔지니어들이 공유하는 통념은 소규모의 효율성을 무시할 것을 요구합니다. 그러나 나는 이것이 "최적화 된"프로그램을 디버깅하거나 유지할 수없는 어리석은 어리석은 프로그래머들에 의해 실행되고 있다고 보는 남용에 대한 과잉 반응이라고 믿는다. 기존 엔지니어링 분야에서 쉽게 얻을 수있는 12 % 개선은 한계로 간주되지 않습니다. 소프트웨어 엔지니어링에서도 같은 관점이 우세해야한다고 생각합니다. 물론 나는 일회성 작업에서 그러한 최적화를 수행하는 것을 귀찮게하지 않을 것입니다. 그러나 그것이 양질의 프로그램을 준비하는 문제 일 때, 그러한 효율성을 부정하는 도구에 제 자신을 제한하고 싶지 않습니다 [즉, goto
이 맥락에서 진술].
그가 따옴표 안에 "최적화"를 어떻게 사용했는지 기억하십시오 (소프트웨어가 실제로 효율적이지 않을 수 있음). 또한 그가 어떻게 "돈이 많고 어리석은"프로그래머들을 비판하는 것이 아니라, 당신이 작은 비 효율성을 항상 무시해야한다고 제안함으로써 반응하는 사람들도 주목하십시오. 마지막으로 자주 인용되는 부분 :
효율성의 성배가 남용으로 이어진다는 것은 의심의 여지가 없습니다. 프로그래머는 프로그램의 중요하지 않은 부분의 속도에 대해 생각하거나 걱정하는 데 막대한 시간을 낭비하며 이러한 효율성 시도는 실제로 디버깅 및 유지 관리를 고려할 때 강력한 부정적인 영향을 미칩니다. 97 % 정도의 작은 효율성은 잊어 버려야합니다. 조기 최적화는 모든 악의 근원입니다.
... 그리고 프로파일 링 도구의 중요성에 대해 더 알아보세요.
측정 도구를 사용해 온 프로그래머의 보편적 인 경험이 직관적 인 추측이 실패했기 때문에 프로그램의 어떤 부분이 정말 중요한지에 대해 사전에 판단하는 것은 종종 실수입니다. 7 년 동안 이러한 도구로 작업 한 후, 지금부터 작성된 모든 컴파일러는 모든 프로그래머에게 프로그램의 어떤 부분이 가장 비용이 많이 드는지 나타내는 피드백을 제공하도록 설계되어야한다고 확신했습니다. 실제로이 피드백은 특별히 꺼져 있지 않는 한 자동으로 제공되어야합니다.
사람들은 그의 말을 곳곳에서 오용 해 왔으며, 그의 논문 전체가 마이크로 최적화를 옹호 할 때 마이크로 최적화가 시기상조라고 제안하는 경우가 많습니다! 그가 항상 작은 효율성을 무시하면서이 "통상적 인 지혜"를 반영하는 그가 비판했던 사람들 중 하나는 원래 모든 형태의 마이크로 최적화를 방해하는 그러한 유형에 대해 부분적으로는 부분적으로 지시 된 그의 인용문을 종종 오용하고 있습니다. .
그러나 프로파일 러를 들고있는 숙련 된 손이 사용할 때 적절하게 적용된 마이크로 최적화 를 찬성하는 인용문이었습니다 . 처럼 오늘날의 유비 상당 수 있습니다 "사람들은 자신의 소프트웨어를 최적화하는 맹인의 찌르기를 복용하지 않아야하지만, 참조의 지역성을 개선하기 위해 핵심 분야에 적용 할 때 사용자 정의 메모리 할당 자는 큰 차이를 만들 수있다" 또는 " 필기 SIMD 코드는을 사용하여 SoA 담당자는 유지 관리가 정말 어렵고 모든 곳에서 사용해서는 안되지만 숙련되고 안내 된 손이 적절하게 적용하면 메모리를 훨씬 더 빨리 소비 할 수 있습니다. "
Knuth가 위에서 홍보 한대로 신중하게 적용된 마이크로 최적화를 홍보하려고 할 때마다 초보자가 .NET을 사용하기 위해 전체 소프트웨어를 다시 작성하는 것과 같이 너무 흥분하고 맹목적으로 최적화에 찌르는 것을 막기 위해 면책 조항을 던지는 것이 좋습니다 goto
. 그게 부분적으로 그가하고 있었던 일입니다. 그의 말은 사실상 큰 면책 조항의 일부였습니다. 마치 누군가가 불타는 불 구덩이에서 오토바이 점프를하는 것처럼 아마추어가 집에서 이것을 시도해서는 안된다는 면책 조항을 추가하는 동시에 적절한 지식과 장비없이 시도하고 다치는 사람들을 비판 할 수 있습니다. .
그가 "조기 최적화"라고 생각한 것은 자신이하는 일을 효과적으로 알지 못하는 사람들이 적용한 최적화였습니다. 최적화가 정말 필요한지 몰랐고, 적절한 도구로 측정하지 않았고, 아마도 그 특성을 이해하지 못했을 것입니다. 그들의 컴파일러 또는 컴퓨터 아키텍처, 그리고 무엇보다도 "엄청나게 어리석은"것이 었습니다. 즉, 동전을 꼬집음으로써 최적화 (수백만 달러를 절약) 할 수있는 큰 기회를 간과했습니다. 더 오래 효과적으로 디버그하고 유지합니다.
만약 당신이 "pennywise-and-pound-foolish"카테고리에 맞지 않는다면, 당신이 goto
중요한 루프의 속도를 높이기 위해 a 를 사용하고 있더라도 Knuth의 표준에 의해 너무 일찍 최적화되지 않는 것입니다. 오늘날의 옵티 마이저에 대한 많은 도움이 될 수 있지만, 만약 그렇게된다면 진정으로 중요한 영역에서는 너무 일찍 최적화하지 않을 것입니다). 진정으로 필요한 영역에 실제로 무엇을하든 적용하고 있으며 진정으로 혜택을받는다면 Knuth의 눈에는 훌륭한 일을하고있는 것입니다.