Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

아이템 67. 최적화는 신중히 하라 #67

Open
Yerimi11 opened this issue Apr 3, 2023 · 4 comments
Open

아이템 67. 최적화는 신중히 하라 #67

Yerimi11 opened this issue Apr 3, 2023 · 4 comments
Assignees

Comments

@Yerimi11
Copy link
Contributor

Yerimi11 commented Apr 3, 2023

No description provided.

@Yerimi11
Copy link
Contributor Author

Yerimi11 commented Apr 3, 2023

67. 최적화는 신중히 하라


성능 때문에 견고한 구조를 희생하지 말자

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

좋은 프로그램: 정보 은닉 원칙 따르므로 개별 구성요소의 내부를 독립적으로 설계할 수 있다.

아키텍처의 결함이 성능을 제한하는 상황 → 시스템 전체를 다시 작성하지 않고는 해결하기 불가능할 수 있음

따라서, 설계 단계에서 성능을 반드시 염두에 두고 시작해야 함.

  • 성능을 제한하는 설계를 피해라

    • API, 네트워크 프로토콜, 영구 저장용 데이터 포맷 등의 설계 요소들은 완성 후에는 변경하기 어렵거나 불가능하다. 또한 시스템 성능을 심각하게 제한할 수 있다.
  • API를 설계할 때 성능에 주는 영향을 고려해라

    • public 타입을 가변으로 만들어서 내부 데이터를 변경할 수 있게 만들면 불필요한 방어적 복사를 수없이 유발할 수 있다.
    • 컴포지션으로 해결 가능한데도 상속 방식으로 설계한 public 클래스는 상위 클래스에 영원히 종속되며 그 성능 제약까지도 물려받는다.
    • 인터페이스도 있는데 굳이 구현 타입을 사용하는 것 역시 좋지 않다. 특정 구현체에 종속되어, 더 빠른 구현체가 나와도 이용하지 못하게 된다.
  • java.awt.Component 클래스의 getSize 메서드

    • 해당 API는 이 메서드가 Dimension 인스턴스를 반환하도록 가변으로 설계
    • getSize를 호출하는 모든 곳에서 Dimension 인스턴스를 새로 생성함(방어적 복사 때문에)
    • 수백만개 생성시 부담 가능성

    → 불변으로 만드는게 가장 이상적,
    getSize를 getWidth, getHeight처럼 기본 타입 값들을 따로 반환하도록 나누는 방법도 있음.

    • API설계 결정의 폐해
  • 각각 최적화 시도 전후로 성능을 측정하라

  • 자바의 성능 모델은 정교하지 않고, 구현 시스템/릴리즈/프로세서 마다 차이가 있어서 각각 하드웨어 플랫폼에서 최적화의 효과를 측정해봐야 한다 (측정의 중요성)

@Yerimi11 Yerimi11 self-assigned this Apr 3, 2023
@YunDaHyee
Copy link
Contributor

개발할 때마다 성능을 고민했던 적이 많은데 견고한 설계 자체가 먼저이네요

@jioome
Copy link
Contributor

jioome commented Apr 5, 2023

처음부터 성능과 구조를 잘 고려해서 개발해야겠습니다

@kiki-sati
Copy link
Collaborator

개발하면서 성능을 먼저 생각해야하는건가..? 싶은 고민 지점이 있었는데
처음부터 성능 구조를 같이 고려해서 코드를 짜야겠습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants