- 데이터 필드(인스턴스/클래스 변수)를 조작하기 위해 임시 로컬 변수를 사용한다.
- 인스턴스 변수를 한번 이상 초기화 하지 마라
- 되도록 상속 깊이를 싶지 않도록 유지한다.
- 객체 생성에 부하를 분산 분산시키려면 늦은 초기화(lazy initialization)을 사용한다.
- 많은 객체가 필요하다면 되도록 애플리케이션 초기에 객체를 만들어둔다.
- Read-Only 와 단일 쓰레드일 경우 동기화 사용을 피한다.
- Enumerator 는 Iterator 보다 훨씬 빠르다.
- Iterator.hasNext() 와 Enumerator.hasMoreElements()는 Collection 크기가 결정되어 있다면 반복적으로 호출할 필요가 없다. 대신에 collection.size() 와 loop counter를 사용한다.
- int 형은 가장 빠른 데이터 타입
- 컴파일러 최적화 (?g:none)
- System.arraycopy()를 사용한다.
- 코드 블록을 동기화 할 때 약간 빠르다면 메소드 전체를 동기화 한다.
- 필요한 곳에만 예외를 사용한다.
- private, static 메소드, final 클래스를 사용하라 컴파일러가 inlinng을 좀더 잘 할 수 있다.
- 설계 시 성능을 고려한다.
- 필드 사용시 한번만 할당하면 되는 정적 필드를 사용하라
- final 클래스는 일반 클래스보다 빠르다.
- ==가 equal()보다 빠르다.
- 문자를 처리할 때에는 String 을 char[]로 변경한다.
ArrayList가 Vector보다 빠르다.
LinkedList는 배열 앞에 객체를 삽입할 때 ArrayList보다 빠르다. 그러나 indexed lookup은 느리다.
- 더 이상 사용하지 않는 객체는 null로 한다.
필요할때 메모리를 재사용하려면 SoftReferences를 사용한다.
- File.length()는 시스템 호출을 하므로 느리다.
- 비슷한 loop 기리 묶어라
- 상수 비교를 loop 밖으로 옮긴다.
- loop 안에서는 지역 변수만 사용하도록 한다. loop전에 클래스 필드를 지역 필드로 할당한다.
- loop 안에서 객체 할당을 하지 마라(readLine()이 대표적인 예)
- 테스트 기간 동안은 ?verbosegc
- 가능한한 간단한 테스트 케이스를 작성한다.
- 되도록 거꾸로 loop를 돌린다.
- Vector는 사용하기 쉽지만 성능이 떨어진다. 특히 loop 내에서 elementAt()을 사용하지 않는다.
StringTokenizer는 매우 비효율적이다.
StringBuffer 는 최초 생성시 최대 크기를 미리 지정한다.
