성능이 측정되지는 않았지만 코드 크기를 늘리거나 가독성을 떨어 뜨리지 않고 훨씬 더 빠르게 만들 수있는 명백한 나쁜 코드 나 코드를 정당화하기 위해이 인용구를 사용하는 경우가 종종있었습니다.
일반적으로 초기의 미세 최적화는 나쁜 생각 일 수 있습니다. 그러나 매크로 최적화 (O (N ^ 2) 대신 O (log N) 알고리즘을 선택하는 것과 같은 것)는 종종 가치가 있으며 O (N ^ 2) 알고리즘을 작성하는 것은 낭비가 될 수 있으므로 조기에 수행해야합니다. 그런 다음 O (log N) 접근 방식을 위해 완전히 버립니다.
단어가 참고 가 될 수 있습니다 다음 O (N ^ 2) 알고리즘이 간단하고 쓰기 쉬운 경우가 너무 느린 것으로 밝혀지면, 당신은 많은 죄책감없이 나중에 버릴 수 있습니다. 그러나 두 알고리즘이 비슷하게 복잡하거나 예상 작업 부하가 너무 커서 이미 더 빠른 알고리즘이 필요하다는 것을 알고 있다면 조기에 최적화하는 것이 장기적으로 총 작업 부하를 줄이는 건전한 엔지니어링 결정입니다.
따라서 일반적으로 올바른 접근 방식은 코드 작성을 시작하기 전에 옵션이 무엇인지 확인하고 상황에 가장 적합한 알고리즘을 의식적으로 선택하는 것입니다. 가장 중요한 것은 "조기 최적화는 모든 악의 근원"이라는 문구가 무지에 대한 변명이 아니라는 것입니다. 커리어 개발자는 일반적인 운영 비용이 얼마인지에 대한 일반적인 아이디어를 가지고 있어야합니다. 예를 들어
- 그 문자열은 숫자보다 더 비싸다
- 동적 언어는 정적으로 유형이 지정된 언어보다 훨씬 느립니다.
- 연결된 목록에 비해 배열 / 벡터 목록의 장점
- 해시 테이블 사용시기, 정렬 된 맵 사용시기 및 힙 사용시기
- "이중 장치와 함께 작동하는 경우" "double"과 "int"는 데스크톱에서 유사한 성능을 갖지만 (FP는 더 빠를 수도 있음) FPU가없는 저가형 휴대 장치에서는 "double"이 100 배 느려질 수 있습니다.
- 인터넷을 통한 데이터 전송은 HDD 액세스보다 느리고 HDD는 RAM보다 훨씬 느리며 RAM은 L1 캐시 및 레지스터보다 훨씬 느리며 인터넷 작업은 무기한 차단 될 수 있습니다 (언제든지 실패 할 수 있음).
또한 개발자는 작업에 적합한 도구를 쉽게 사용할 수 있도록 데이터 구조 및 알고리즘 도구 상자에 익숙해야합니다.
많은 지식과 개인용 도구 상자가 있으면 거의 쉽게 최적화 할 수 있습니다. 불필요한 최적화에 많은 노력을 기울이는 것은 사악한 일입니다 (그리고 그 함정에 두 번 이상 넘어가는 것을 인정합니다). 그러나 배열 대신 세트 / 해시 테이블을 선택하거나 string [] 대신 double [] 에 숫자 목록을 저장하는 것만 큼 최적화가 쉬운 경우 왜 그렇지 않습니까? 나는 여기 Knuth에 동의하지 않을 수도 있습니다. 확실하지 않지만, 나는 그가 저수준 최적화에 대해 이야기하고 있다고 생각하지만 고수준 최적화에 대해서는 이야기하고 있습니다.
1974 년 컴퓨터는 느리고 컴퓨팅 성능이 비싸서 일부 개발자는 한 줄씩 지나치게 최적화하는 경향이있었습니다. 나는 그것이 Knuth가 추진 한 것이라고 생각합니다. 그는 1974 년에 말 그대로 미친 이야기 일 것이기 때문에 "성능에 대해 전혀 걱정하지 마십시오"라고 말하지 않았습니다. Knuth는 최적화 방법 을 설명 하고 있었습니다 . 간단히 말해 병목 현상에만 집중해야하며 그 전에 병목 현상을 찾기 위해 측정을 수행해야합니다.
측정 할 프로그램을 작성할 때까지 병목 현상을 찾을 수 없으므로 측정 할 항목이 있기 전에 성능 결정을 내려야 합니다 . 때로는 이러한 결정이 잘못되면 변경하기가 어렵습니다. 이러한 이유로, 어떤 비용이 드는지에 대한 일반적인 아이디어를 가지고 있으면 사용 가능한 하드 데이터가 없을 때 합리적인 결정을 내릴 수 있습니다.
작업을 최적화하는 데 걸리는 시간과 성능에 대해 얼마나 걱정해야합니까? 몇 번만 실행되는 스크립트를 작성할 때 성능에 대한 걱정은 대개 완전한 시간 낭비입니다. 그러나 Microsoft 또는 Oracle에서 일하고 수천 명의 다른 개발자 가 수천 가지 다른 방식으로 사용할 라이브러리에서 작업하는 경우 지옥을 최적화하는 데 비용을 지불하여 다양한 모든 것을 처리 할 수 있습니다 사용 사례를 효율적으로 그럼에도 불구하고 성능에 대한 요구는 항상 가독성, 유지 보수성, 우아함, 확장 성 등에 대한 요구와 균형을 이루어야합니다.