2009.01.19 21:52
윈도우에는 계산기가 들어있다. 바로 calc다.
이 calc로 컴퓨터의 간단한 성능테스트를 할 수가 있다.

50000을 입력한 후 !(느낌표,Shift+1)를 입력한다.
!보면 알 수 있듯이 50000 factorial을 구하는 것이다.
50000*49999* ... * 1 이다. 곱하기 50000번 한다.
어쨌거나 요즘 잘나간다는 넷북으로 계산기 테스트를 해봤다.

삼성 NC10의 결과는 40초 이상이었다.
요즘 좀 최신형 피씨다 싶으면 17~18초 정도 나온다.
이 계산기는 싱글 코어만 사용하기 때문에, 하나의 코어에서 얼마나 빨리 계산할 수 있느냐를 나타낸다고 할 수있다.

50000! 의 결과는 다음과 같다.
위의 그림과 같이 213236승 정도의 단위이다.

한 가지 재밌는 점은 한 2년 정도전에 구입한 3.2Ghz Xeon이 두개 꼽혀 있는 연구실 컴퓨터에서 대략 8초 정도의 경이로운 속도가 나온 것이다. 이는 제온 cpu의 성능이 좋아서가 아니라(코어2듀오보다 느린 것같다)  Vista 64bit의 calc가 64bit로 돌아가기 때문인 것 같다.
제온 쿼드코어와 Windows 2003 x64가 설치되어 있는 서버에서도 calc는 64bit로 실행되며, 유사한 계산 속도를 보였다.

이에 자바로 50000!를 계산하면 어떤 결과가 나올 것인가가 궁금해졌다.
그래서 해봤다.
자바는 선에서 64bit OS용으로 배포되고 있는 것이다.

첫 번째, double을 이용해 계산해보았다. double을 64bit로 되어있다.
아래와 같이 계산 결과와 걸린 시간을 초단위로 나타내도록 했다.

...그러나 결과는 시궁창. 무한대가 나와버렸다.
갑자기 계산기 대단해 보인다.
그래서 BigInteger로 해봤다. 물론 계산기가 결과값은 부동소수점 수로 보여주고 있기 때문에, 부동소수점 계산을 하고 싶지만, BigFloat 등의 클래스는 보이지 않기 때문에, BigInteger로 해봤다. 정수 연산을 하니 당연히 정확도 100%다.
계산이 오래걸릴 것 같아서 진행정도를 확인하기 위해 중간에 i를 출력하고 있다.
그러나 역시 현실은 시궁창.
실행은 되었으나 결과를 출력하지 못한다. 아마 긴 길이의 String을 출력하는 데 문제가 생긴 것 같다. 이클립스에서 실행하고 있으니 이클립스 문제일 수 도있다.

어찌됐건 실행은 완료되었고, 시간은 11초가 걸렸다. 기대보다 훨씬 빨랐다.
계산이 제대로 되었는지 믿지 못하겠다면 다음과 같이 실행하면 된다.

이번엔 다행히 결과가 시궁창을 면했다. 맨 위에 있는 윈도우 계산기의 결과와 비교해보면 자리수가 일치함을 알 수 있다.
마지막으로 결과를 출력하는데 약간의 변화를 주었다.
계산기와 유사하게 출력하도록 했다.
결과는 3.347320509597144836915476094071486477912e+213236 이다.

계산기 결과와 비교해보면,
윈도우 계산기:          3.3473205095971448369154760940715e+213236
자바 BigInteger 계산: 3.347320509597144836915476094071486477912e+213236
그 결과가 일치하는 것을 확인할 수 있다.

사실 자바에서 BigInteger로 계산하면 메모리도 많이 먹고, 머하는지 모르겠는데, i값을 50000까지 출력하고 한참있다가 Result를 출력한다. BigInteger의 toString() 가 문제인가.
어쨌거나 64bit용 jvm이 64bit machine을 효율적으로 이용하고 있다는 것을 확인할 수 있었고, 사실 c로 작성되었을(모 어셈블리어로 작성되지는 않았겠지, 초기 paint가 assembly로 작성되었다나 모래나) 윈도우 계산기보다 그리 느리지 않은 성능을 보였다는 것은 고무적이다.

메인 메모리는 2기가를 사용하고 있으므로, 64bit의 진가를 느낀 것은 처음이다. ㅋ




Posted by 나야

댓글을 달아 주세요