컴퓨터 공학

멀티스레드 환경에서 합병정렬을 통한 C++과 Go언어 성능비교

혼새미로 2020. 7. 27. 21:05
반응형

"1920s france la vie parisienne magazine of Spider-Man standing with an umbrella in front of a classic car." from DALL-E 2

[테스트 환경]
*운영체제 : 윈도우 10 프로 (1903 버전)
*CPU : AMD Ryzen 7 1700 8-core
*RAM : 32 GB
*C++ 컴파일러 : MinGW 8.1.0 64-bit
*Go 컴파일러 : 1.13.5
*데이터 최대값 : 100,000,000
*연산 : 멀티스레드 기반의 합병정렬
 
 
[데이터 변수]
*스레드 개수 : 1, 2, 4, 8, 16, 32, 64
  → 데이터 개수 100,000,000 개 고정
*데이터 개수 : 20,000,000, 40,000,000, 60,000,000, 80,000,000, 100,000,000
  → 스레드 개수 16 개 고정
 
 
[결과]
스레드 개수 1 2 4 8 16 32 64
C++ 16.8536 8.8936 5.017 3.366 2.79 2.71 2.693
Go 18.983 10.37 6.3683 4.2963 3.6809 3.6043 3.605
 
 
[특이사항]
*두 언어 모두 스레드 개수가 증가함에 따라 수행시간 (초)이 점점 감소하였다. C++의 경우 16 스레드는 1 스레드보다 6.04배 빠른 결과를 보였다. Go의 경우 16 스레드는 1 스레드보다 5.16배 빠른 결과를 보였다.
*두 언어 모두 32 스레드와 64 스레드에서는 16 스레드와 동일한 수행시간을 보였다. 스레드가 아무리 많아도 수행시간은 CPU 코어 개수에 의존적이다.
*1 스레드에서 C++은 Go보다 1.13배 빠른 결과를 보였다. 8 스레드에서 C++은 Go 보다 1.28배 빠른 결과를 보였다. 16 스레드에서 C++은 Go 보다 1.37배 빠른 결과를 보였다. 스레드 개수가 많아질수록 C++과 Go의 성능 차이가 더 크게 나타났다.
 
 
데이터 크기 20000000 40000000 60000000 80000000 100000000
C++ 0.5299 1.0873 1.6347 2.21366 2.80234
Go 0.79833 1.691 2.679 3.63866 4.64533
 
[특이사항]
*두 언어 모두 데이터 개수가 선형적으로 증가함에 따라 수행시간 (초)이 선형적으로 증가하였다. 
*데이터 개수가 2천만개 일 때 C++은 Go보다 1.51배 빠른 결과를 보였다. 데이터 개수가 6천만개 일 때 C++은 Go보다 1.64배 빠른 결과를 보였다. 데이터 개수가 1억개 일 때 C++은 Go보다 1.66배 빠른 결과를 보였다. 데이터 개수가 많아질수록 두 언어의 수행시간 차이는 더 크게 나타났다.
 
 
[결론]
*언어와 상관없이 스레드 개수가 코어 개수와 근접할수록 더 빠른 성능 보여주었고, C++은 Go보다 1.3~1.6배 빠른 결과를 보여주었다.
 
전체 소스코드는 https://github.com/NurimOnsemiro/mergesort_thread_lang_compare에 올려두었습니다.

 

반응형