자바 vs C 성능비교

자바가 C 와 성능차가 별로 안난다는 사람들혹은 글들을 종종 봅니다.

과연 그주장이 맞는지 직접 테스트해보았습니다.

일단 자바측에서 주장한 간단한 소스하나를 가져왔습니다.

==========================

public class Speed_K {
  static boolean c1 = true, c2=true;
  public static void main(String[] args) {
    long start = 0, end = 0, elapsed;
    try {Thread.sleep(5000L);} catch (InterruptedException e) {}



    for(int k=0; k<5; k++) {
      start = System.currentTimeMillis();
      if( end == 0 ) end = start;
      doo( (int)((end - start)/1000));
      end = System.currentTimeMillis();
      System.out.println("Elapsed time:"+((end-start)/1000.));
    }
  }

  static public int doo( int in ){
    int i,j;
    int count = 5;
    int n = 50000000;
    int sum =0;

n = n + in;
    for(i=0; i< count;i++) {
      for(j=0; j<n;j++){
        if ( c1 == true){
          if (c2 == true) { sum ++;}
          else { sum--; }
        }
      }
      c2 = ! c2;
    }
    return sum;
  }
}

========================================

#include <sys/time.h>
#include <stdio.h>
double elapse_tm( void );


int c1 = 1, c2=1;
int main( void )
{
int k;
    long start, end, elapsed;
    double dd;

    printf( "sizeof int=%d long=%d\n", sizeof(int), sizeof(long));
elapse_tm();
    for( k=0; k<5; k++)
    {
      doo( (int) dd );

      printf("Elapsed time:%f\n", (dd = elapse_tm()));
    }
}

int doo( int in )
{
    int i,j;
    int count = 5;
    int n = 50000000;
    int sum =0;

n = n + in;
    for(i=0; i< count;i++) {
      for(j=0; j<n;j++){
        if ( c1 == 1){
          if (c2 == 1) { sum ++;}
          else { sum--; }
        }
      }
      c2 = !c2;
    }
    return sum;
}

double elapse_tm( void )
{
        static struct timeval et = { 0, 0 };
        struct timeval st;

        st = et;
        gettimeofday( &et, NULL );

        if( st.tv_sec == 0 && st.tv_usec == 0 ) return 0;
        return et.tv_sec - st.tv_sec + ( et.tv_usec - st.tv_usec ) / 1000000.;
}

=====================================================
소스가 약간달라 비슷하게 개선되었습니다.
=====================================================

컴파일옵션 -O3

결과

[localhost test_src]$ java Speed_K
Elapsed time:1082
Elapsed time:1054
Elapsed time:1160
Elapsed time:1181
Elapsed time:1204
[localhost test_src]$ cc -O3 Speed_K.c
[localhost test_src]$ ./a.out
Elapsed time:0.249474
Elapsed time:0.250046
Elapsed time:0.249660
Elapsed time:0.249515
Elapsed time:0.250348

자바는 밀리세컨드 C는 초단위 따라서 자바는 1.1 초정도이고 C는 0.25 초 정도입니다.
제가해본바로는..무려 400%의 성능차가나는데..

더구나 동일코드상으로는 C가 최척화되어 결과가 0에 가까웠습니다.
그래서 보시다시피 최적화 되지못하게 불리한코드 dd변수를 추가하였는데도불구하고 훨씬빠르네요.

자바가 어떤옵션으로 더욱성능이 증가된다거나 하는것이 있으면 테스트후 결과좀 올려주세요..

---컴파일러.-------
[localhost test_src]$ java -version
java version "1.6.0_01"
Java(TM) SE Runtime Environment (build 1.6.0_01-b06)
Java HotSpot(TM) Client VM (build 1.6.0_01-b06, mixed mode, sharing)

[localhost test_src]$ cc --version
cc (GCC) 4.1.1 20070105 (Asianux 3.0 4.1.1-52.2.1)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Microwindows GUI C++ framework 입니다.

Embedded GUI를 검토하면서 microwindows 를 c++에서 쓸려고 wrapping한것입니다.
기존에도 microwindows 패키지내에 이와 유사한게 들어 있지만.
MFC의 message map같은것도 추가하고 이것저것 편리하게 넣었습니다.

제 홈페이지인 http://www.korone.net/?doc=bbs/gnuboard.php&bo_table=mystuff_prog&wr_id=... 이곳에서도 볼 수 있습니다.

이 프로그램의 저작권은 http://www.korone.net 조병완에게 있습니다.