빠른 프로그램보다는 좋은 프로그램를 작성하라

  • 성능보다는 견고한 구조에 집중하세요
  • 견고한 구조란 캡슐화가 잘 된, 다른 모듈과 결합성이 낮은 아키텍처를 이야기합니다
  • 성능같은 구현 상의 문제는 나중에 최적화해서 해결할 수 있지만, 아키텍처의 결함은 시스템 전체를 다시 작성하지 않고는 해결하기 불가능할 수 있습니다

변경하기 어려운 설계에서는 성능을 생각하라

  • 변경하기 가장 어려운 설계 요소는 API, 네트워크 프로토콜, 영구 저장용 데이터 포맷 등이 있습니다
  • 이런 설계 요소들은 완성 후에 변경하기 어렵거나 불가능할 수 있으며, 동시에 시스템 성능을 심각하게 제한할 수 있습니다
  • 만약 API, 네트워크 프로토콜, 영구 저장용 데이터 포맷을 설계할 일이 있다면 성능을 염두하세요

API를 설계할 때 성능에 주는 영향을 고려하라

  • 위에 말한 것처럼 API는 완성 후 변경하기 어렵습니다
  • 아래를 참조해 설계할 때 성능에 주는 영향을 고려하세요
    • 내부 데이터를 변경할 수 없도록 만드세요 (아이템 50)
    • 상속이 아닌 컴포지션 관계로 만드세요 (아이템 18)
    • 구현 타입이 아닌 인터페이스 타입을 만드세요 (아이템 64)

문제의 원인이 되는 곳에 최적화를 하라

  • 최적화 전후에 성능을 측정해보세요
  • 최적화해봤자 성능이 생각보다 좋아지지 않는 경우가 있으며 심지어 성능을 더 나빠지게 할 수도 있습니다.
  • 느릴 거라고 짐작한 부분을 최적화했는데 성능에 별다른 영향을 주지 않는다면 시간만 허비한 꼴이 됩니다.
  • 프로파일링 도구를 사용하면 최적화를 어디에 하면 좋을지 알려줍니다
    • 프로파일링 도구를 사용하면 메서드의 소비 시간과 호출 횟수 같은 런타임 정보를 알 수 있습니다
    • 참고로 대부분의 프로파일링 도구는 유료라고 합니다.
  • 자바 코드의 성능을 알기 쉽게 보여주는 벤치마킹 프레임워크인 JMH(Java Microbenchmark Harness)도 있습니다.
    • OpenJDK에서 개발한 무료 성능 측정 툴입니다
    • JVM에서 돌아가는 언어를 전부 측정할 수 있습니다
    • 해당 메서드가 얼마나 걸리는지 알 수 있습니다.

요약

성능보다는 견고한 구조의 프로그램을 작성하자
견고한 구조의 프로그램을 작성하다보면 성능은 자연스레 따라온다
시스템을 구현했다면 성능을 측정해보자. 충분히 빠르다면 최적화를 하지 않아도 괜찮다
만약 최적화를 한다면 문제의 원인이 되는 부분을 파악한 후 최적화를 하자

출처

  • 이펙티브 자바 3판