목요일, 1월 31, 2008

코드 최적화

아래의 일반적인 코드를
Properties prop = System.getProperties();
Enumeration enums = prop.propertyNames();

while(enums.hasMoreElements()) {
String key = (String)enums.nextElement();

System.out.println("[key]" + key + "[value]" + prop.getProperty(key));
}

위의코드를 디컴파일 해보았다. 컴파일러는 다음과 같이 최적화 하였다.
Properties prop = System.getProperties();
String key;
for(Enumeration enums = prop.propertyNames();
enums.hasMoreElements();
System.out.println("[key]" + key + "[value]" + prop.getProperty(key)))
key = (String)enums.nextElement();

와 같이 된다.

그럼 다음과 같은 코드는 어떻게 되겠는가?
int i=0;
while(true) {
System.out.println("ahah");

if(i++ > 100) break;
}
다음과 같이 최적화된다.
int i = 0;
do
System.out.println("ahah");
while(i++ <= 100);

사람이 살작 빈틈있게 코드를 만들어도 컴파일러가 다음과 같이 최적화 해준다.
BCI 작업할때 참고해야겠으며 컴파일러의 자바 버전 별 최적화 패턴등도 어느정도는 정리를 해둬야겟다.

위의 최적화의 공통점은, while보다는 for문이, 두번 검사보다는 한번이, 반복문 내에 있는 변수는 밖으로 빼지 않았는가? 무심코 작성한 코드들이 전체 시스템에 얼마나 치명적인지...

최적화 하니 병아리 눈꼽만큼이겠지만, 모이면 큰 javac option -g:noe 옵션을 사용해볼만하다.
debugging info를 삭제하고 byte코드를 최적화 하는것이다.
또 다른 방법은 디컴파일 방지툴을 돌리는것도 하나의 방법이 되겟다. 보통 방지툴을 돌리면 클래스, 메소드,변수이름 자체를 a,b,c 이런식으로 만들어 버려서 결과적으로 바이트 코드 크기 자체가 줄어들게 되어서 jvm의 부담을 줄여주는 효과를 볼수 있게된다. 물런 이것 말고도, bci를 이용해서 줄여주는 방법이 있겠지만, 요새 같은 환경에서는 불필요한 과도한 환경이 되겟다.

시스템 튜닝하는데 가장먼저 손쉽게 할수 있는게 java option을 맟추는 것이라고, 어느 책에서 언급하였다는걸 세삼 실감한다.

댓글 없음:

댓글 쓰기