10만 팩토리얼 구하기 (Scala) 컴퓨터

관련 링크:
10만 팩토리얼 계산 속도

위 링크의 글타래를 보고 Scala로 100000!을 구해보았다.

참고: Scala는 Java Virtual Machine 위에서 동작하는 객체지향+함수형 프로그래밍 언어다. (.NET Framework 위에서도 동작한다.)

코드는 위 글타래에 있다.

총 4개를 올렸는데 각각 속도의 차이가 크다. 테스트 환경은 Athlon64 3800+ (1-core 2.4GHz), Ubuntu Linux 64-bit인 서버컴퓨터.

1. Tail recursion을 이용한 내림차순 단순 곱셈 (100000 * 99999 * 99998 * ... * 2 * 1)
2. Folding을 이용한 오름차순 단순 곱셈 (1 * 2 * 3 * ... * 99998 * 99999 * 100000)
3. Actor를 이용한 2단 병렬 곱셈 (1 * 2 * ... * 49999 * 50000) * (50001 * 50002 * ... * 99999 * 100000)
4. Actor를 이용한 256단 병렬 곱셈 (1 * 257 * ...) * (2 * 258 * ...) * (3 * 259 * ...) * ... * (256 * 512 * ...)

결과값은 10진수 기준 자리수가 무려 456,574 자리나 되는 것으로 적어봐야 무의미할 것이다.

아래로 갈수록 속도가 빨랐다. (순서대로 약 43초, 37초, 27초, 4초)

3, 4번의 경우 병렬이어서 빠른 영향보단 곱셈을 하는 두 수 중 큰 수의 자리수를 최소화시키는 영향이 더 큰 것으로 생각된다. 아무래도 싱글코어이니만큼 2단은 몰라도 256단의 병렬은 그리 도움은 안될 것이기 때문이다. 다만 actor 없이 단일스레드로 같은 방식으로 연산해본 결과 500ms~1s정도 미세하게 더 느렸다. 즉, actor 256개를 사용하면 미미하긴 하지만 오버헤드보다는 성능 향상이 더 크다는 이야기다. Actor 256개 돌리는데 사용한 thread가 몇개였는지는 확인해보지 못했다.

또 한가지 특이했던 것은, 서버컴퓨터가 Athlon64-X2 4800+인 데스크탑(2-core 2.5GHz; Windows XP 32-bit)보다 빠른 속도로 100000!을 구하는 것이었다. 64비트의 위력이 실감된다. 반면 10000!(1만 팩토리얼)은 데스크탑이 더 빨랐는데 자리수가 커지면 커질수록 64비트가 유리해지는 모양이다.


덧글

댓글 입력 영역