java, ruby, python 속도 비교..

속도 비교라고는 하지만 단순 integer add연산과 string concat연산을 multi thread 환경에서 얼마나 빨리 해내는가를 비교해 봤다.

어플리케이션을 수행하는데 있어서 가장중요하다는 위의 연산들을 조합하니, 각 언어별로 single thread integer, single thread string, multithread integer, multithread string 의 네가지, 그리고 언어는 java, ruby, python 그리고 java nojit까지 해서 네가지...

총 4*4 = 16가지의 경우가 있었다.

integer는 1~10000까지의 덧셈을 열번
string은 "1"~"10000" 까지의 string을 연결
을 각각 10번씩 - single thread에서는 순차적으로 열번, multi thread에서는 10개의 thread에서 동시에..
돌려본 결과는 다음과 같다.(user time + system time)

약어는 다음과 같다

i : integer multi thread
is : integer single thread
s : string multi thread
ss : string single thread

java nojit i : 0.138s
java nojit is : 0.135s
java nojit s : 64.420s
java nojit ss : 26.70s
java i : 0.143s
java is : 0.137s
java s : 65.695s
java ss : 26.275s
python i : 0.218s
python is : 0.187s
python s : 3.930s
python ss : 3.623s
ruby i : 0.044s
ruby is : 0.043s
ruby s : 4.480s
ruby ss : 4.389s

보기는 약간 어렵겠지만 결과 가 꽤 놀랍다. java 의 경우 jit를 켰을때나 껐을때나 결과가 거의 비슷하다는 것이 놀랍고(어쩌면 한 클래서 내에서만 루프를 돌려서 이런 결과가 나왔는지도 모르지만... 그렇다 하더라도 BufferedString쪽 routine은 컴파일 되야 될거 아냐!!) 그 보다 더욱더 놀라운 것은 string concat는 python이나 ruby가 수십배.. 빠르다는 것..
그리고 threading을 잘처리하는 것으로 알려져 있던 java 에서 multi threading의 엄청난 overhead..

web programming의 기본은 string 처리이다. 그리고 많은 request를 동시에 처리하기 위해 적은 threading overhead 또한 중요하다. string처리를 주로 하는 web programming에서 느리다고 소문난 interpreter 방식의 ruby나 python이 각광받는 데에는 그럴만한 이유가 있었던 셈이다.
그리고, 얼마전에 얼핏 얘기했던 더이상 느릴 수 없는 ruby interpreter 구현.. 이라는 언급은 취소해야 겠다. YAVM개발자의 주장만 보고 확인해 보지 않고 했던 이야기인데... 다시한번 확인해 보기전에는 어떤것도 믿을 수 없다는 것을 실감 했다.

마지막으로 이해를 돕기위해 그래프 두장.

사용자 삽입 이미지

사용자 삽입 이미지

PS.
각 언어의 version은 다음과 같다.
ruby : ruby 1.8.5 (2006-08-25) [i686-darwin8.8.2]
python : Python 2.3.5 (#1, Aug 19 2006, 21:31:42)
java : Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_07-164)

테스트한 시스템은 MacBookPro Core2Duo 2.33GHz
테스트한 코드는 아래의 test.zip 에 들어있다.
java는 apple 에서의 porting 실수에 의한 것일 가능성도 없지는 않다. 다른 platform에서는 확인해보지 않았으니 말이다.

Trackback 0 Comment 6
prev 1 ··· 25 26 27 28 29 30 31 32 33 ··· 67 next