자바가 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.
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 조병완에게 있습니다.