소수 구하기 프로그램을 만들어 성능테스트
By SeukWon Kang
dos와 turbo-c 시절 부터의 취미인 소수 구하기 프로그램을 만들어 성능테스트 하기 입니다.
16bit 시절 부터 이런 저런 방법으로 소수구하기 프로그램을 짜고 시간측정을 해가며 옵티마이징하는 취미가 있었습니다.
새 컴퓨터 , 새 OS , 새 언어 , 새 cpu, 등이 생기면 항상 그 환경용 으로 작성해서 성능의 변화를 즐기고 있었는데 최근 몇년간은 intel의 삽질로 별다른 변화가 없어서 거의 잊고 있었습니다.
하지만 이번에 AMD 8코어 16 쓰레드 cpu와 새 램(ddr4) 이 생겼으니 테스트를 할 생각이 들어서 작업을 해봤습니다.
게다가 이번에는 충분한 코어/쓰레드와 편한 multi-thread 개발 환경(go 언어) 가 있으니 드디어 생각만 하고 못하고 있던 multi-thread로 소수 구하기를 할 수 있었습니다.
아래 패키지를 받아서 example.go 를 실행해 보면 알수 있지만
간단히 요약하면
channel 을 사용하면 16 thread를 사용하게 만들어도 single thread 버전의 2배 정도 속도만 나온다.
(MultiAppendFindTo)
channel을 사용하지 않도록 만들면 (MultiAppendFindTo3,MultiAppendFindTo4) 약 8배 정도의 성능 향상(16thread에서) 이 있다.
go의 channel은 아주 편한 도구지만 이렇게 아주 작은 단위의 작업을 위해 사용하기는 느리다.
slice의 buffer realloc을 최적화하는 것은 생각보다 성능의 영향이 작다.
MultiAppendFindTo3 vs MultiAppendFindTo4
입니다.
https://github.com/kasworld/primenum
패키지 설명
prime number finder
소수를 여러가지 방법(6가지)으로 구하는 패키지 입니다.
<a href=“https://github.com/kasworld/primenum#%EA%B8%B0%EB%8A%A5"
id=“user-content-기능” class=“anchor” aria-hidden=“true” style=“background-color: initial; box-sizing: border-box; color: #0366d6; float: left; line-height: 1; margin-left: -20px; padding-right: 4px; text-decoration-line: none;">기능
MakePrimes
가장 기본적인 구한 소수들을 테이블에 보관해가면서 더 큰 소수들을 찾아 냅니다.
아래의 PrimeIntList 를 쓰지 않습니다.
type PrimeIntList
구한 소수 테이블을 유지하면서 추가로 소수들을 구해가기 위한 정보들 담고 있습니다.
AppendFindTo : 주어진 인자 까지 수수를 찾아 냅니다.
MultiAppendFindTo : go channel 과 go routine worker 를 사용해서 multithread로 소수를 구합니다.
MultiAppendFindTo2 : channel 사용를 줄여 속도를 올린 함수 입니다.
MultiAppendFindTo3 : channel사용을 없애고 worker 별 계산 결과를 merge sort로 취합합니다.
MultiAppendFindTo4 : 계산용 buffer를 미리 alloc해서 slice의 크기를 늘이기 위한 오버헤드를 줄였습니다.
<a
href=“https://github.com/kasworld/primenum#%EC%82%AC%EC%9A%A9-%EC%98%88%EC%A0%9C" id=“user-content-사용-예제” class=“anchor” aria-hidden=“true” style=“background-color: initial; box-sizing: border-box; color: #0366d6; float: left; line-height: 1; margin-left: -20px; padding-right: 4px; text-decoration-line: none;">사용 예제
example/example.go 참조.