개발자라면 한 번쯤 이런 말들을 들어보았을 것이다.
스크립트 언어는 느리다.
매니지드 언어(C++)가 언매니지드 언어(Java) 보다 빠르다.
나눗셈(/), 실수, 문자열 연산은 느리다.
필자의 경우 이전에 게임 서버를 처음 개발할 때 난수 생성과 확률의 계산을 실수 값으로 했다가
정수 값으로 전부 고쳐야 했던 경험이 있다.
과연 얼마나 차이가 나길래 저런 말들을 하는 건지 궁금해져서 간단하게 테스트해보기로 했다.
테스트한 언어는 다음과 같다.
- C++
- C#
- Java
- Python
- NodeJS
방식은 간단하다.
숫자 연산은 10,000,000 번씩 100회의 평균 시간
문자열 연산은 100,000 번씩 100회의 평균 시간
위 표에서 + H 는 '값 = 값 + 2' 로 연산 (하드코딩), + V 는 '값 = 값 + 값(2) (변수)' 로 연산한 것이다.
먼저 파이썬이 가장 눈에 띄는데 정수 연산의 경우 다른 4가지 언어에 비해서 현저히 느렸다.
같은 스크립트 언어인 NodeJS 에 비해서도 10배 이상 느린 결과를 보여준다.
이 결과에 대해서는 상당히 충격적이었는데 한편으론 인공지능 언어로 파이썬을 쓴다는 게 좀 의아했다.
다음으로 살펴볼 건 나눗셈 연산이다.
표를 보면 갑자기 튀는 모습을 볼 수 있는데 이는 다음에 확인할 실수 연산의 속도와 같았고
이를 통해 나눗셈 연산은 정수가 아닌 실수로 계산된다고 추측해볼 수 있다.
특히 여기서 C# 과 NodeJS 의 경우 하드코딩과 변수 차이 없이 실수 연산을 하는 모습을 볼 수 있었다.
마지막으로 살펴볼 건 자바이다.
얼핏 보면 특이점을 놓칠 수도 있지만 정수형 하드코딩 연산 부분에서 측정불가에 가까운 속도를 낸다.
또한 정수형 하드코딩 나눗셈 연산에서 C# 과 NodeJS 만큼은 아니지만 시간이 조금 느려진 모습을 보이는데
이 또한 자바의 실수 연산 속도와 비슷한데 오히려 좀 더 느리다. (이 부분은 다음 실수 결과에서 다시 보자)
우선 앞에서 살펴본 정수 연산에 비해서 확연히 느려진 것을 볼 수 있다.
이를 통해 실수 연산이 정수보다 느린 것은 확실해졌다.
정수와 마찬가지로 실수 또한 나눗셈에서는 느려지는데
필자가 알기로는 나눗셈 연산은 곱셈으로 변환되어 처리가 되는 걸로 알고 있다.
아마 이러한 이유 때문에 정수와 마찬가지로 느린 것일 거고
자바의 정수 나눗셈이 실수 나눗셈보다 느린 이유를 짐작해 볼 수 있다.
파이썬은... 여전히 타의 추종을 불허하여 많이 느리다.
같은 스크립트 언어인 NodeJS 에 비해서도 상당히 느린데 왜 그런지는 잘 모르겠다.
이 표에서의 특이점은 언어별 연산속도에 있다.
C# 의 경우 파이썬을 제외하면 가장 느린 모습을 보여준다.
언매니지드 언어라서 그런 건가 싶지만 그에 반해 자바는 C++ 보다 훨씬 빠르며
스크립트 언어인 NodeJS 또한 C++ 보다 훨씬 빠르다.
앞선 정수 연산에서도 두 언어가 타 언어 대비 빠른 속도를 보여주는데 왜 그런지까지는 잘 모르겠다.
측정 방식이 잘못된 게 아니라면 숫자 연산에 대해서 최적화가 잘 되어있다는 건데
내부적으로 캐시 같은 게 존재하는 건 아닐까 생각한다.
위 표에서 + 1 은 '값 = 값 + A', + 4 는 '값 = 값 + ASDF' 로 연산한 것이다.
연산 횟수가 10,000,000 에서 100,000 으로 줄었음에도 불구하고
숫자 연산에 비해서 엄청난 시간이 소요되는데 C++ 기준으로 같은 연산 횟수일 때 대략 2000배의 속도 차이가 난다.
또한 추가되는 문자열의 양에 따라 이 속도는 급격히 느려진다.
여기서 생각지도 못한 결과가 나왔는데 파이썬과 NodeJS 의 문자열 연산 속도가 매우 빠르다는 것이다.
테스트를 잘못한 건가 싶어서 몇 번이나 다시 해보았지만 결과는 같았다.
어쩌면 컴파일을 하지 않는 스크립트 언어의 특징 같은 건지도 모르겠다.
나눗셈, 실수, 문자열 연산이 느리다는 결과가 나올 거라는 건 예상했었지만
언어별 속도 차이에 대해서는 꽤나 흥미로운 결과였다.
물론 테스트는 아주 단순한 예제로 진행되었기 때문에 복잡한 연산의 경우
결과가 달라질 수도 있긴 하지만 스크립트 언어를 다시 보게 된 나름 가치 있는 테스트였던 것 같다.
그리고 NodeJS 와 자바의 숫자 연산이 빠른 이유, 파이썬이 느린 이유,
스크립트 언어의 문자열 연산이 빠른 이유를 아시는 분은 댓글 부탁드립니다!