[Effective-Java] Chapter9 #67. 최적화는 신중히 하라

2023. 7. 26. 13:17·Reference/Effective-Java
(맹목적인 어리석음을 포함해) 그 어떤 핑계보다 효율성이라는 이름 아래 행해진 컴퓨터 죄악이 더 많다(심지어 효율을 높이지도 못하면서).
- 윌리엄 울프
(전체의 97% 정도인) 자그마한 효율성은 모두 잊자. 섣부른 최적화가 만악의 근원이다.
도널드 크루스
최적화를 할 때는 다음 두 규칙을 따르라.
첫 번째, 하지 마라.
두 번째, (전문가 한정) 아직 하지 마라.
다시 말해, 완전히 명백하고 최적화되지 않은 해법을 찾을 때까지는 하지 마라.
- M. A. 잭슨
💡 빠른 프로그램보다는 좋은 프로그램을 작성하라
  • 성능 때문에 견고한 구조를 희생하지 마라.
  • 좋은 프로그램이지만 성능이 나오지 않는 것이라면 아키텍처 자체가 최적화의 길을 안내해줄 것이다.
    • 좋은 프로그램은 정보 은닉 원칙을 따르므로 개별 구성요소의 내부를 독립적으로 설계할 수 있다.
    • 따라서 시스템의 나머지에 영향을 주지 않으면서, 각 요소를 다시 설계할 수 있다.
  • 구현상의 문제는 나중에 최적화가 가능하지만, 아키텍처의 결함이 성능을 제한한다면 시스템 전체를 다시 작성해야할 수도 있다.

 

📌 소프트웨어 설계 시 고려사항

1️⃣ 성능을 제한하는 설계를 피하라.

  • 컴포넌트끼리, 혹은 외부 시스템과의 소통 방식은 완성 후 변경하기 가장 어려운 설계 요소다.
    • API, Network Protocol, 영구 저장용 데이터 포맷 등
  • 이런 설계 요소들은 완성 후 변경이 어렵거나 불가능할 수 있으며, 시스템 성능을 심각하게 제한할 수 있다.

 

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

  • public 타입을 가변으로 만들면, 불필요한 방어적 복사를 수없이 유발할 수 있다. (Item 50)
    • java.awt.Component 클래스의 getSize가 반환하는 Dimension 인스턴스는 가변이라 getSize를 호출하는 모든 곳에서 방어적 복사를 수행해야 한다.
  • Composition으로 해결 가능하면서 상속 방식으로 설계한 public은 상위 클래스에 영원히 종속되며, 성능과 제약까지도 물려받는다. (Item 18)
  • Interface type이 있는데 구현체 타입을 사용하면, 특정 구현체에 종속되며 더 나은 구현체가 나와도 사용할 수 없게 된다. (Item 64)

 

3️⃣ 성능을 위해 API를 왜곡하는 건 매우 안 좋은 생각이다.

  • 잘 설계된 API는 성능도 좋은 게 보통이다.
  • API를 왜곡하도록 만든 성능 문제는 플랫폼이나 아랫단 소프트웨어 개선으로 사라질 수도 있다.
  • 왜곡된 API로 인한 고통은 사라지지 않는다.

 

4️⃣ 각각의 최적화 시도 전후로 성능을 측정하라

  • 신중하게 설계하여 깨끗하고 명확하고 멋진 구조를 갖춘 상태에서 성능에 만족하지 못한 경우에만 최적화를 고려해볼 차례가 된다.
  • 프로파일링 도구(profiling tool)는 최적화 노력을 집중해야 할 곳을 알려준다.
    • 개별 메서드 소비 시간과 호출 횟수 같은 런타임 정보를 제공한다.
    • 시스템 규모가 커질 수록 찾기가 힘들기 때문에 프로파일러가 중요해진다.
  • jmh는 프로파일러는 아니지만 Java 코드 상세 성능을 알기 쉽게 보여주는 마이크로 벤치마킹 프레임 워크다.
  • Java는 성능 모델이 덜 정교하여 측정의 중요성이 더 크다.
    • 프로그래머가 작성한 코드와 CPU에서 수행하는 명령 사이의 '추상화 격차'가 크다.
    • 이로 인해 최적화로 인한 성능 변화를 일정하게 예측하기가 더 어렵다.
    • 여러 플랫폼에서 구동한다면 구현과 하드웨어 플랫폼 사이에서 성능을 타협해야 할 수도 있다.

 

 

[Java] JMH(Java Microbenchmark Harness) 로 성능 벤치마킹

JMH 는 JVM 위에서 동작하는 코드의 성능을 측정해주는 라이브러리이다.사실 정확한 성능을 측정하기 위해선 사용하는 가상머신의 제품에 따라 Hot-Spot VM 오버헤드나 GC 오버헤드와 같은 코드가 동

velog.io

 

저작자표시 비영리 (새창열림)
'Reference/Effective-Java' 카테고리의 다른 글
  • [Effective-Java] Chapter10 #69. 예외는 진짜 예외 상황에만 사용하라
  • [Effective-Java] Chapter9 #68. 일반적으로 통용되는 명명 규칙을 따르라
  • [Effective-Java] Chapter9 #66. 네이티브 메서드는 신중히 사용하라
  • [Effective-Java] Chapter9 #65. 리플렉션보다는 인터페이스를 사용하라
나죽못고나강뿐
나죽못고나강뿐
싱클레어, 대부분의 사람들이 가는 길은 쉽고, 우리가 가는 길은 어려워요. 우리 함께 이 길을 가봅시다.
  • 나죽못고나강뿐
    코드를 찢다
    나죽못고나강뿐
  • 전체
    오늘
    어제
    • 분류 전체보기 (463)
      • Computer Science (60)
        • Git & Github (4)
        • Network (17)
        • Computer Structure & OS (13)
        • Software Engineering (5)
        • Database (9)
        • Security (5)
        • Concept (7)
      • Frontend (21)
        • React (13)
        • Android (4)
        • iOS (4)
      • Backend (79)
        • Spring Boot & JPA (51)
        • Django REST Framework (14)
        • MySQL (9)
        • Nginx (1)
        • FastAPI (4)
      • DevOps (24)
        • Docker & Kubernetes (11)
        • Naver Cloud Platform (1)
        • AWS (2)
        • Linux (6)
        • Jenkins (0)
        • GoCD (3)
      • Coding Test (112)
        • Solution (104)
        • Algorithm (7)
        • Data structure (0)
      • Reference (135)
        • Effective-Java (90)
        • Pragmatic Programmer (0)
        • CleanCode (11)
        • Clean Architecture (2)
        • Test-Driven Development (4)
        • Relational Data Modeling No.. (0)
        • Microservice Architecture (2)
        • 알고리즘 문제 해결 전략 (9)
        • Modern Java in Action (0)
        • Spring in Action (0)
        • DDD start (0)
        • Design Pattern (6)
        • 대규모 시스템 설계 (6)
        • JVM 밑바닥까지 파헤치기 (4)
        • The Pragmatic Programmer (1)
      • Service Planning (2)
      • Side Project (5)
      • AI (0)
      • MATLAB & Math Concept & Pro.. (1)
      • Review (19)
      • Interview (3)
      • IT News (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃
  • 공지사항

    • 한동안 포스팅은 어려울 것 같습니다. 🥲
    • N Tech Service 풀스택 신입 개발자가 되었습니다⋯
    • 취업 전 계획 재조정
    • 취업 전까지 공부 계획
    • 앞으로의 일정에 대하여..
  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
나죽못고나강뿐
[Effective-Java] Chapter9 #67. 최적화는 신중히 하라

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.