ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • java, ruby, python 속도 비교..
    분류없음 2007.03.08 10:12
    속도 비교라고는 하지만 단순 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에서는 확인해보지 않았으니 말이다.

    댓글 6

    • navis 2007.03.08 14:35

      자바..
      StringBuffer b = new StringBuffer();
      for (int i = 0; i < 10000; i++) {
      b = b.append(i);
      }
      로 고치면 비슷하게 나옵니다. 같지 않은것을 같이 비교하시면 안되죠..

      • Favicon of https://reply.tistory.com _reply_ 2007.03.08 16:04 신고

        그렇군요..

        말씀하신대로 수정해서 돌려보니 정상적인 결과가 나오는군요.. jit까지 하는 환경에서 말도 안되는 결과가 나와서 시간나는데로 원인을 파악해 보려고 하고 있던 참이었습니다.

        같지 않은것을 같이 비교한건.. 실수입니다만.. 같은것을 같지 않게 처리하는 java도.. 문제인듯 하군요..

        아래에 다시 나온 결과 입니다.

        java -Xint i 0m0.134s
        java -Xint is 0m0.132s
        java -Xint s 0m0.283s
        java -Xint ss 0m0.284s
        java i 0m0.134s
        java is 0m0.134s
        java s 0m0.187s
        java ss 0m0.184s
        python i.py 0m1.010s
        python is.py 0m0.202s
        python s.py 0m3.587s
        python ss.py 0m3.536s
        ruby i.rb 0m0.280s
        ruby is.rb 0m0.048s
        ruby s.rb 0m4.178s
        ruby ss.rb 0m4.115s

      • Favicon of https://reply.tistory.com _reply_ 2007.03.08 19:16 신고

        그런데 java에서 String "+" 연산이 상당히 느리다는 것이 server programmer들 사이에선 널리 알려져 있는 사실인가요? 저는 처음 겪는 상황이라 이렇게 금방 문제를 지적하신게.. 신기하네요..

    • Favicon of https://leafriend.tistory.com 엽우 2007.03.09 09:21 신고

      자바의 String연산은 느리기로 워낙 유명하지요.
      그래서 log4j 같은 경우 로그 String 연산이 많이 느리기 때문에 로그를 남기기 전 해당 레벨이 켜져있는 가를 확인하지요.
      ex)
      log.error("어쩌구 저쩌구 오류가 " + this.getClass().getName() + "에서 발생했습니다 - " + e.getMessage());
      ->
      if (log.isErrorEnable()) {
      log.error("어쩌구 저쩌구 오류가 " + this.getClass().getName() + "에서 발생했습니다 - " + e.getMessage());
      }

    • 창완 2007.10.10 13:15

      ruby에 프로그램도 수정해야합니다.

    • 창완 2007.10.10 13:21

      b = ""
      10000.times do |i|
      b << i.to_s
      end
      위와 같이 수정해야 합니다.

Designed by Tistory.