2009.09.29 22:52
OS를 64bit로 설치하면, JVM도 64bit로 설치하고 싶어집니다. 하지만, Eclipse를 비롯한 많은 툴들을 64bit로 사용하려면 불편한 점들이 많습니다. 
그래서 64bit JVM의 성능을 테스트 해보기로 했습니다. 64bit jvm으로 검색해보면, 더 많은 메모리를 사용할 수 있지만, 성능에 있어서는 메리트가 없다는 글을 읽어볼 수 있는데, 성능에서 메리트가 없다면, 굳이 64bit JVM을 사용할 필요가 없기 때문입니다. 

결론부터 말씀드리자면 잘 모르겠다이지만, 흥미로운 결과를 볼 수 있습니다. 

일단 32bit JVM과 64bit JVM을 모두 설치했습니다. 
그리고 이클립스도 32bit 버전과 64bit 버전을 모두 다운받아서 압축을 풀어놓았습니다. 
두 가지 이클립스를 모두 실행시켜보니, 32bit 버전의 이클립스는 eclipse.exe 프로세스만 실행되지만, 64bit 버전의 이클립스는 eclipse.exe 프로세스 외에 javaw.exe 프로세스가 별도로 실행되며 이 프로세스가 주된 프로세스입니다. 


위의 그림에서 *32 로 표시되어 있는 eclipse가 32비트로 동작하고 있으며, 메모리가 184MB정도 차지하고 있네요. 

그리고 다음과 같은 간단한 테스트를 해보았습니다. 
1. int 형 더하기 연산
2. long 형 더하기 연산
3. float 형 더하기 연산
4. double 형 더하기 연산
6. ArrayList, LinkedList methods
7. String add method

코드는 조악하기 때문에 일단 생략하고, 최대한 다른 연산은 생략하고, 연산만 여러번 하게 했습니다. 
결과는 다음과 같은데 좀 이상합니다.

위쪽이 64bit jvm, 아래쪽이 32bit jvm이며, 32bit jvm은 시간이 오래 걸려서 세번만 한다음 평균내었습니다. 단위는 ms입니다. 
특이한 점은 64bit jvm 에서의 int, float, double 덧셈 연산의 속도입니다. 32bit jvm과는 비교할 수 없을 정도로 빠른 속력을 보여주었습니다. 
long 역시 2배 정도 빠르게 계산했습니다. 

먼저, int, float, double 연산을 좀 살표보자면, 
9ms라는 것은 뭔가 아무것도 실행되지 않은 것만 같습니다. 

코드는 아래와 같습니다.

long sT= System.currentTimeMillis();
int temp=0;
for(int j=0; j< Integer.MAX_VALUE;j++) { temp= j+j; }
System.out.println(temp);
System.out.println("Integer Addition: "+ (System.currentTimeMillis()-sT));

4번째 줄에 temp를 출력하고 있는데 값이 할당만 되고 사용되지 않으면, 컴파일러가 하는지, jvm이 하는지 모르겠지만, temp에 관련된 코드는 실행되지 않습니다. 그래서 출력하고 있습니다. 
어쨌든, 이런 코드를 9ms라는 경이로운 속도로 계산합니다. 좀 이상해서 아래와 같이  반복문을 한번 더 감쌌습니다. 

long sT= System.currentTimeMillis();
int temp=0;
for(int i=0; i< Integer.MAX_VALUE;i++) {
     for(int j=0; j< Integer.MAX_VALUE;j++) { temp= j+j; }
}
System.out.println(temp);
System.out.println("Integer Addition: "+ (System.currentTimeMillis()-sT));

이번에는 12,839 ms 정도의 시간이 걸렸습니다. 9 ms * Integer.MAX_VALUE 정도의 시간이 걸릴 줄 알았는데, 12 초밖에 안걸렸네요. 
그리고 이번에는 수정한 코드는 32bit jvm 에서 실행하려고 하다가 백만년 걸릴 것 같아서 밖의 루프를 세번만 돌렸습니다. 14초 정도 나왔는데, 한번만 돌렸을 때보다 4배정도 시간이 더 걸렸습니다.

어쨌거나 int, float, double 계산에서는 64bit jvm 이 엄청난 연산 속도를 보여주었습니다. 
float과 double 연산 속도에 차이가 나지 않는 이유도 궁금하지만 지금 시간이 새벽 1시 55분이므로 뭔가 자야겠다는 압박에 패스.

그러나 사실, int, float, double 연산을 어떤 프로그램이 그렇게 많이 하겠습니까.
자바로 포토샵 만들것도 아니라는...
그래서 ArrayList, LinkedList의 add연산 속도를 보았습니다. 

그리고 그 결과는..
사실 별차이가 없을 것이라고 생각했는데, 
ArrayList의 경우는 64bit jvm이, LinkedList의 경우는 32bit jvm이 빠른 속도로 실행되었습니다. 

... 뭥미 ...
add 메소드를 분석해보고 싶지만, 좀전에도 말씀드렸지만 지금 시간이 1시 55분인데다 내일은 마드리드에서 귀국하셔서 아직 여독이 풀리지 않으셨을 교수님과의 랩미팅이 있기때문에 그만 자고 싶습니다. 

그래도 궁금하기 때문에 소스를 쓱 봤는데, 알고 계시는 것처럼, ArrayList의 add연산자는 내부 array객체가 모두 할당되면, 그 전에 만들어져있던 배열 크기의 3/2 배 크기의 배열을 새로 만들고 복사하고, LinkedList 는 앞뒤 객체를 할당하는 연산을 합니다. 

자 이제 그만 자야겠기에 섣부른 결론은 내리겠습니다. 
int, float, double 에 대한 단순 수치 연산은 64bit jvm이 엄청나게 빠르다. 
객체 할당 연산(예를 들면, Object obj= otherObject ) 은 32bit jvm이 2배 빠르다. (요건 메모리 주소 범위가 넚기 때문일 것 같다는...) 

 테스트 환경은 Vaio TT2인데, CPU는 SU9600(1.60GHz), Windows 7 64bit 입니다. 
CPU-Z를 급 다운받아서 확인해보면 아래와 같이 나오네욥. 


TT가 음질, 무게, 배터리 등 장점은 많은데, 아무래도 CPU 성능은 좀 아쉽습니다.
또 뻘짓하다가 3시가 다되었습니다. ㅜㅜ
...
...
Posted by 나야