'Ruby'에 해당되는 글 2건

  1. 2007.03.17 java, python, ruby threading 효율 비교

java, python, ruby threading 효율 비교

지난번 속도 비교는 java의 string연산을 잘못 사용하여 크게 잘못된 결과가 나왔었다. 그 뿐 아니고 integer operation의 경우에도 연산횟수가 너무 적어서 interpreter/vm이 올라오는 시간에 크게 영향을 받아서 거의 의미없는 결과가 나왔던 것임이 확인되었다.


그래서 이번에는 연산의 횟수를 충분히 늘리고 돌려본 결과 java 가 interprete만을 하는 경우에도 약 100배의 성능을 보이는 것으로 나타났다. 그래서 order를 맞추기 위해 java의 경우 100배 더 많은 operation을 해서 threading overhead가 얼마나 되는지를 중점으로 테스트 했다.

즉, ruby/python은 100만번씩 열 세트, java의 경우 1억번씩 열세트.. is case에는 각 세트를 순차적으로, i case에는 열 세트를 열개의 분리된 thread로 수행했다.

결과는

dual cpu
java -Xint i        :    9.606   
java -Xint is       :   18.562  
java i              :    2.001   
java is             :    3.754   
python i.py         :   14.297  
python is.py        :   10.937  
ruby i.rb           :    9.381   
ruby is.rb          :    8.213   

single cpu
java -Xint i        :   21.718  
java -Xint is       :   22.530  
java i              :    4.413   
java is             :    4.535   
python i.py         :   15.060  
python is.py        :   13.445  
ruby i.rb           :   11.524  
ruby is.rb          :   10.005 


그래프 몇장으로 설명을 하면 다음과 같다.
일단 그래프 부터..

사용자 삽입 이미지

테스트 결과


test 하는 김에 dual cpu에 대한 활용도도 같이 확인해 볼겸 cpu 두개를 다 켜고, 그리고 cpu하나는 끈 상태로 테스트를 해 보았다. 나타난 숫자는 연산을 하는데 걸린 "초" 이다. java 만 빼고 그놈이 그놈인 것으로 보일 것이다.



사용자 삽입 이미지

multi / single thread 걸린 시간 비율


두번째 그래프는 single thread일때와 multi thread일때의 걸린 시간 비율이다. ruby/python의 경우 1보다 큰데, 그 큰 값 만큼이 threading overhead이다. 즉, single thread로 돌렸을 때가 오히려 더 빠르다는 말이다. cpu 하나일 경우에는 당연한 얘기겠지만, java의 경우는 꼭 그렇지만도 않다. java의 경우 threading을 했을 경우 1보다 작게 나왔다. 놀랍다. threading overhead가 전혀 없다는 말이다. 거기에다가 더욱 놀라운 것은 dual core일 때의 0.5에 근접한 저 값인데, 문론 lock이나 ipc가 전혀 없어서 완전히 분리해서 돌릴수 있는 별개의 job 이기 때문 이긴 하지만, 교과서에서 배운 이상적인 값인 0.5(dual 이니까 절반의 시간) 에 거의 근접한 숫자가 나왔다. 수고했다 SUN...



사용자 삽입 이미지

dual / single core 걸린 시간 비율


마지막으로, 각 설정별 dual core일때와 single core일때의 비율인데, dual core일때 single core일때에 비해서 얼만큼 더 빨라지나를 의미한다. java 가 multi thread일때만 dual core가 의미가 있고 다른 경우에는 거의 효과가 없다.

결과적으로 python이 dual cpu일때 1.3이라는 꽤 안좋은 효율을 보여준다는 것을 제외하고는 java, ruby, python 공히 threading에 대한 overhead가 그리 크지 않다는 것과, ruby나 python의 속도를 빠르게 하고자 dual core를 사용한다는 것은 무모한 짓이라는 것, 마지막으로 java는 dual core에 대해 훌륭한 최적화를 해 놓았다는 것을 알 수 있다.

ruby, python이 dual core에서 성능 향상 효과를 보지 못하는 것은 얼마전에 퍼키님이 깊숙히 찌르신 GIL (Global Interpreter Lock) 때문이다. python 뿐 아니고 ruby interpreter도 GIL은 가지고 있는 모양이다.

마지막으로 테스트한 코드는 여기

Trackback 0 Comment 0
prev 1 2 next