심심해서.. 비교..

plusme의 이미지

java 1.4.2_03
vc++ 6.0

java가 쫌더 빠르게 나오네요..

#include <iostream.h>
#include <time.h>


void main()
{
 long start_time = time(NULL);
 
 double a = 8.0;
 double b = 3.0;
 for(int i = 0 ; i<90000000;i ++)
 {
  a/=(b+=a);
 }
 
 cout << (long)time(NULL) - start_time << endl;
}

public class TestJava
{
 public static void main(String[] args)
 {
  System.currentTimeMillis();
  System.out.println();
  long start = System.currentTimeMillis();
  double a = 8.0;
  double b = 3.0;
  for(int i = 0 ; i<90000000;i ++)
  {
   a/=(b+=a);
  }
  System.out.println( (System.currentTimeMillis() - start )/1000 );
 }
}

[/code]

myueho의 이미지

Debug와 Realese의 성능차이가 많이 나던데

Realese에서 테스트 하신건가요?

gokucse의 이미지

펜4 2.4B, 768MB(DDR PC2700), WinXP pro+sp1,

VC++ 6.0 + SP5
J2SDK 1.4.2 에서 테스트 하였습니다.

Release mode로 컴파일 하여 cmd 창에서 실행
D:\work\Bench01\Release>bench01.exe
TEST #0000 -> 1.312 sec
TEST #0001 -> 1.328 sec
TEST #0002 -> 1.313 sec
TEST #0003 -> 1.312 sec
TEST #0004 -> 1.344 sec
TEST #0005 -> 1.313 sec
TEST #0006 -> 1.312 sec
TEST #0007 -> 1.344 sec
TEST #0008 -> 1.312 sec
TEST #0009 -> 1.313 sec
TEST #0010 -> 1.328 sec
TEST #0011 -> 1.312 sec
TEST #0012 -> 1.313 sec
TEST #0013 -> 1.344 sec
TEST #0014 -> 1.312 sec
TEST #0015 -> 1.313 sec
TEST #0016 -> 1.328 sec
TEST #0017 -> 1.312 sec
TEST #0018 -> 1.313 sec
TEST #0019 -> 1.329 sec
TEST #0020 -> 1.312 sec
TEST #0021 -> 1.313 sec
TEST #0022 -> 1.328 sec
TEST #0023 -> 1.312 sec
TEST #0024 -> 1.328 sec
TEST #0025 -> 1.328 sec
TEST #0026 -> 1.313 sec
TEST #0027 -> 1.312 sec
TEST #0028 -> 1.329 sec
TEST #0029 -> 1.312 sec
TEST #0030 -> 1.313 sec
TEST #0031 -> 1.343 sec
TEST #0032 -> 1.313 sec
TEST #0033 -> 1.312 sec
TEST #0034 -> 1.328 sec
TEST #0035 -> 1.313 sec
TEST #0036 -> 1.312 sec
TEST #0037 -> 1.344 sec
TEST #0038 -> 1.297 sec
TEST #0039 -> 1.328 sec
TEST #0040 -> 1.328 sec
TEST #0041 -> 1.313 sec
TEST #0042 -> 1.328 sec
TEST #0043 -> 1.328 sec
TEST #0044 -> 1.344 sec
TEST #0045 -> 1.344 sec
TEST #0046 -> 1.312 sec
TEST #0047 -> 1.313 sec
TEST #0048 -> 1.328 sec
TEST #0049 -> 1.312 sec
TEST #0050 -> 1.313 sec
TEST #0051 -> 1.343 sec
TEST #0052 -> 1.313 sec
TEST #0053 -> 1.312 sec
TEST #0054 -> 1.329 sec
TEST #0055 -> 1.312 sec
TEST #0056 -> 1.313 sec
TEST #0057 -> 1.343 sec
TEST #0058 -> 1.313 sec
TEST #0059 -> 1.312 sec
TEST #0060 -> 1.328 sec
TEST #0061 -> 1.313 sec
TEST #0062 -> 1.312 sec
TEST #0063 -> 1.344 sec
TEST #0064 -> 1.313 sec
TEST #0065 -> 1.312 sec
TEST #0066 -> 1.344 sec
TEST #0067 -> 1.297 sec
TEST #0068 -> 1.312 sec
TEST #0069 -> 1.344 sec
TEST #0070 -> 1.313 sec
TEST #0071 -> 1.312 sec
TEST #0072 -> 1.328 sec
TEST #0073 -> 1.313 sec
TEST #0074 -> 1.312 sec
TEST #0075 -> 1.344 sec
TEST #0076 -> 1.312 sec
TEST #0077 -> 1.313 sec
TEST #0078 -> 1.328 sec
TEST #0079 -> 1.313 sec
TEST #0080 -> 1.312 sec
TEST #0081 -> 1.344 sec
TEST #0082 -> 1.312 sec
TEST #0083 -> 1.313 sec
TEST #0084 -> 1.328 sec
TEST #0085 -> 1.312 sec
TEST #0086 -> 1.313 sec
TEST #0087 -> 1.344 sec
TEST #0088 -> 1.312 sec
TEST #0089 -> 1.313 sec
TEST #0090 -> 1.328 sec
TEST #0091 -> 1.312 sec
TEST #0092 -> 1.313 sec
TEST #0093 -> 1.344 sec
TEST #0094 -> 1.296 sec
TEST #0095 -> 1.329 sec
TEST #0096 -> 1.328 sec
TEST #0097 -> 1.312 sec
TEST #0098 -> 1.313 sec
TEST #0099 -> 1.328 sec

Test Count : 100, Avg Time : 1.32063 sec

D:\work\Bench01\Release>

Debug 모드로 컴파일 cmd 창에서 실행

D:\work\Bench01\Debug>bench01.exe
TEST #0000 -> 1.89 sec
TEST #0001 -> 1.891 sec
TEST #0002 -> 1.875 sec
TEST #0003 -> 1.891 sec
TEST #0004 -> 1.89 sec
TEST #0005 -> 1.891 sec
TEST #0006 -> 1.875 sec
TEST #0007 -> 1.906 sec
TEST #0008 -> 1.875 sec
TEST #0009 -> 1.891 sec
TEST #0010 -> 1.89 sec
TEST #0011 -> 1.891 sec
TEST #0012 -> 1.891 sec
TEST #0013 -> 1.89 sec
TEST #0014 -> 1.891 sec
TEST #0015 -> 1.891 sec
TEST #0016 -> 1.875 sec
TEST #0017 -> 1.89 sec
TEST #0018 -> 1.875 sec
TEST #0019 -> 1.891 sec
TEST #0020 -> 1.89 sec
TEST #0021 -> 1.875 sec
TEST #0022 -> 1.891 sec
TEST #0023 -> 1.938 sec
TEST #0024 -> 1.89 sec
TEST #0025 -> 1.875 sec
TEST #0026 -> 1.891 sec
TEST #0027 -> 1.89 sec
TEST #0028 -> 1.891 sec
TEST #0029 -> 1.891 sec
TEST #0030 -> 1.89 sec
TEST #0031 -> 1.891 sec
TEST #0032 -> 1.875 sec
TEST #0033 -> 1.906 sec
TEST #0034 -> 1.875 sec
TEST #0035 -> 1.891 sec
TEST #0036 -> 1.89 sec
TEST #0037 -> 1.891 sec
TEST #0038 -> 1.891 sec
TEST #0039 -> 1.89 sec
TEST #0040 -> 1.891 sec
TEST #0041 -> 1.891 sec
TEST #0042 -> 1.89 sec
TEST #0043 -> 1.875 sec
TEST #0044 -> 1.891 sec
TEST #0045 -> 1.875 sec
TEST #0046 -> 1.89 sec
TEST #0047 -> 1.875 sec
TEST #0048 -> 1.891 sec
TEST #0049 -> 1.891 sec
TEST #0050 -> 1.875 sec
TEST #0051 -> 1.89 sec
TEST #0052 -> 1.891 sec
TEST #0053 -> 1.891 sec
TEST #0054 -> 1.875 sec
TEST #0055 -> 1.89 sec
TEST #0056 -> 1.891 sec
TEST #0057 -> 1.875 sec
TEST #0058 -> 1.875 sec
TEST #0059 -> 1.89 sec
TEST #0060 -> 1.875 sec
TEST #0061 -> 1.891 sec
TEST #0062 -> 1.875 sec
TEST #0063 -> 1.891 sec
TEST #0064 -> 1.89 sec
TEST #0065 -> 1.891 sec
TEST #0066 -> 1.937 sec
TEST #0067 -> 1.891 sec
TEST #0068 -> 1.891 sec
TEST #0069 -> 1.89 sec
TEST #0070 -> 1.875 sec
TEST #0071 -> 1.86 sec
TEST #0072 -> 1.89 sec
TEST #0073 -> 1.891 sec
TEST #0074 -> 1.891 sec
TEST #0075 -> 1.89 sec
TEST #0076 -> 1.891 sec
TEST #0077 -> 1.89 sec
TEST #0078 -> 1.891 sec
TEST #0079 -> 1.891 sec
TEST #0080 -> 1.875 sec
TEST #0081 -> 1.89 sec
TEST #0082 -> 1.891 sec
TEST #0083 -> 1.891 sec
TEST #0084 -> 1.875 sec
TEST #0085 -> 1.937 sec
TEST #0086 -> 1.875 sec
TEST #0087 -> 1.891 sec
TEST #0088 -> 1.89 sec
TEST #0089 -> 1.875 sec
TEST #0090 -> 1.891 sec
TEST #0091 -> 1.891 sec
TEST #0092 -> 1.875 sec
TEST #0093 -> 1.89 sec
TEST #0094 -> 1.891 sec
TEST #0095 -> 1.89 sec
TEST #0096 -> 1.891 sec
TEST #0097 -> 1.891 sec
TEST #0098 -> 1.89 sec
TEST #0099 -> 1.891 sec

Test Count : 100, Avg Time : 1.88828 sec

D:\work\Bench01\Debug>

Java로 실행
C:\j2sdk1.4.2_02\bin>javac TestJava.java

C:\j2sdk1.4.2_02\bin>java TestJava

TEST #0 -> 2.156 sec
TEST #1 -> 2.141 sec
TEST #2 -> 2.125 sec
TEST #3 -> 2.187 sec
TEST #4 -> 2.141 sec
TEST #5 -> 2.14 sec
TEST #6 -> 2.141 sec
TEST #7 -> 2.141 sec
TEST #8 -> 2.14 sec
TEST #9 -> 2.125 sec
TEST #10 -> 2.141 sec
TEST #11 -> 2.125 sec
TEST #12 -> 2.156 sec
TEST #13 -> 2.141 sec
TEST #14 -> 2.14 sec
TEST #15 -> 2.141 sec
TEST #16 -> 2.141 sec
TEST #17 -> 2.14 sec
TEST #18 -> 2.141 sec
TEST #19 -> 2.14 sec
TEST #20 -> 2.141 sec
TEST #21 -> 2.125 sec
TEST #22 -> 2.141 sec
TEST #23 -> 2.125 sec
TEST #24 -> 2.14 sec
TEST #25 -> 2.141 sec
TEST #26 -> 2.141 sec
TEST #27 -> 2.14 sec
TEST #28 -> 2.141 sec
TEST #29 -> 2.14 sec
TEST #30 -> 2.141 sec
TEST #31 -> 2.141 sec
TEST #32 -> 2.14 sec
TEST #33 -> 2.125 sec
TEST #34 -> 2.141 sec
TEST #35 -> 2.141 sec
TEST #36 -> 2.14 sec
TEST #37 -> 2.141 sec
TEST #38 -> 2.125 sec
TEST #39 -> 2.14 sec
TEST #40 -> 2.141 sec
TEST #41 -> 2.188 sec
TEST #42 -> 2.14 sec
TEST #43 -> 2.141 sec
TEST #44 -> 2.14 sec
TEST #45 -> 2.125 sec
TEST #46 -> 2.141 sec
TEST #47 -> 2.141 sec
TEST #48 -> 2.14 sec
TEST #49 -> 2.141 sec
TEST #50 -> 2.125 sec
TEST #51 -> 2.156 sec
TEST #52 -> 2.14 sec
TEST #53 -> 2.125 sec
TEST #54 -> 2.125 sec
TEST #55 -> 2.141 sec
TEST #56 -> 2.125 sec
TEST #57 -> 2.141 sec
TEST #58 -> 2.14 sec
TEST #59 -> 2.141 sec
TEST #60 -> 2.141 sec
TEST #61 -> 2.14 sec
TEST #62 -> 2.156 sec
TEST #63 -> 2.141 sec
TEST #64 -> 2.125 sec
TEST #65 -> 2.141 sec
TEST #66 -> 2.14 sec
TEST #67 -> 2.125 sec
TEST #68 -> 2.141 sec
TEST #69 -> 2.141 sec
TEST #70 -> 2.14 sec
TEST #71 -> 2.141 sec
TEST #72 -> 2.14 sec
TEST #73 -> 2.141 sec
TEST #74 -> 2.141 sec
TEST #75 -> 2.14 sec
TEST #76 -> 2.141 sec
TEST #77 -> 2.141 sec
TEST #78 -> 2.14 sec
TEST #79 -> 2.188 sec
TEST #80 -> 2.14 sec
TEST #81 -> 2.141 sec
TEST #82 -> 2.125 sec
TEST #83 -> 2.141 sec
TEST #84 -> 2.14 sec
TEST #85 -> 2.141 sec
TEST #86 -> 2.14 sec
TEST #87 -> 2.141 sec
TEST #88 -> 2.141 sec
TEST #89 -> 2.14 sec
TEST #90 -> 2.141 sec
TEST #91 -> 2.141 sec
TEST #92 -> 2.14 sec
TEST #93 -> 2.141 sec
TEST #94 -> 2.125 sec
TEST #95 -> 2.14 sec
TEST #96 -> 2.141 sec
TEST #97 -> 2.125 sec
TEST #98 -> 2.156 sec
TEST #99 -> 2.141 sec
Test Count : 100, Avg Time : 2.140149999999997 sec

C:\j2sdk1.4.2_02\bin>

코드는 약간 손을 보았습니다. Java쪽은 거의 해본적이 없어서 문법이
잘 기억이 안났습니다. 그래서 조금 코드가 지저분합니다.

// Bench01.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream.h> 
#include <time.h> 
#include <windows.h> 

#define TEST_RETRY_COUNT		100

int main(int argc, char* argv[])
{
	unsigned long int t_START, t_FINISH;
	double dTimeTotal = 0.0, dTime;

	for (int nTestCount = 0; nTestCount < TEST_RETRY_COUNT; nTestCount++) 
	{
		t_START = GetTickCount();
		double a = 8.0; 
		double b = 3.0; 
		for(int i = 0 ; i<90000000;i ++) 
		{ 
			a/=(b+=a); 
		} 
		t_FINISH = GetTickCount();

		dTime = ((double)(t_FINISH-t_START) / 1000);
		printf("TEST #%04d -> %g sec\n", nTestCount, dTime);
		dTimeTotal += dTime;
	}

	printf("\nTest Count : %d, Avg Time : %g sec\n", TEST_RETRY_COUNT, dTimeTotal / TEST_RETRY_COUNT);
	return 0;
}

public class TestJava 
{ 
 public static void main(String[] args) 
 { 
  System.currentTimeMillis(); 
  System.out.println(); 
  int TEST_RETRY_COUNT = 100;
  double dTimeTotal = 0.0, dTime, dAvg;
  
  for (int nTestCount = 0; nTestCount < TEST_RETRY_COUNT; nTestCount++) {
	  long start = System.currentTimeMillis(); 
	  double a = 8.0; 
	  double b = 3.0; 
	  for(int i = 0 ; i<90000000;i ++) 
	  { 
	   a/=(b+=a); 
	  } 
	  long finish = System.currentTimeMillis();
	  dTime = (double)(finish - start ) / 1000;
	  dTimeTotal += dTime;
	  System.out.println("TEST #"+nTestCount+" -> "+dTime+" sec"); 
  }
  dAvg = dTimeTotal / TEST_RETRY_COUNT;
  System.out.println("Test Count : "+TEST_RETRY_COUNT+", Avg Time : "+dAvg+" sec");
 } 
} 
eungkyu의 이미지

$ cat TestCpp.cpp
#include <iostream>
#include <sys/time.h>

using namespace std;

int main()
{
    struct timeval start, stop;
    gettimeofday(&start, NULL);

    double a = 8.0;
    double b = 3.0;
    for(int i = 0 ; i<90000000;i ++)
    {
        a/=(b+=a);
    }

    gettimeofday(&stop, NULL);
    cout << (stop.tv_sec - start.tv_sec) * 1000 + (stop.tv_usec - start.tv_usec) / 1000 << endl;
}
$ cat TestJava.java
public class TestJava
{
    public static void main(String[] args)
    {
        long start = System.currentTimeMillis();
        double a = 8.0;
        double b = 3.0;
        for(int i = 0 ; i<90000000;i ++)
        {
            a/=(b+=a);
        }
        System.out.println( (System.currentTimeMillis() - start ) );
    }
}
$ cat Makefile
CXX=g++
CXXFLAGS=-O2

all: TestCpp TestJava.class

TestCpp: TestCpp.cpp
TestJava.class: TestJava.java
        javac $<
$ make
g++ -O2    TestCpp.cpp   -o TestCpp
javac TestJava.java
$ ./TestCpp
59
$ java TestJava
1791

제컴퓨터는 이상하네요 C++이 빠르네요...

근데 속도차이가 너무나는게, 옵티마이즈를 해서 그런가...

$ g++ TestCpp.cpp -o TestCpp
$./TestCpp
1552

컴파일러도 똑똑하네요 :)
그리고 옵티마이즈 안해도 C++이 빠르네요.

eungkyu의 이미지

eungkyu wrote:

제컴퓨터는 이상하네요 C++이 빠르네요...

실수, 제컴이 아니고 동아리컴이었습니다 :(
P4 2.8
notpig의 이미지

gokucse wrote:
펜4 2.4B, 768MB(DDR PC2700), WinXP pro+sp1,

VC++ 6.0 + SP5
J2SDK 1.4.2 에서 테스트 하였습니다.

Java로 실행
C:\j2sdk1.4.2_02\bin>javac TestJava.java

C:\j2sdk1.4.2_02\bin>java TestJava

Test Count : 100, Avg Time : 2.140149999999997 sec

C:\j2sdk1.4.2_02\bin>

전 AMD Athlon 1G 512m 에 Win XP 인데...C 는 아직 안돌려보고
자바만 돌려봤는데 2.4~ 2.7 사이로 나오네요~~
CPU 차이가 나는데 이외로 성능차이가 않나서리...이상...
그리고 펜4 1.5 에 리눅스에서 돌릴결과~~~3.4 초 정도 걸리는군요~~`
역시 리눅스에서 자바는 느린건가???

eungkyu의 이미지

neosuper wrote:

#include <iostream.h>
#include <time.h>


void main()
{
 long start_time = time(NULL);
 
 double a = 8.0;
 double b = 3.0;
 for(int i = 0 ; i<90000000;i ++)
 {
  a/=(b+=a);
 }
 
 cout << (long)time(NULL) - start_time << endl;
}

public class TestJava
{
 public static void main(String[] args)
 {
  System.currentTimeMillis();
  System.out.println();
  long start = System.currentTimeMillis();
  double a = 8.0;
  double b = 3.0;
  for(int i = 0 ; i<90000000;i ++)
  {
   a/=(b+=a);
  }
  System.out.println( (System.currentTimeMillis() - start )/1000 );
 }
}

저번 답글 달때 모르고 언급을 안했는데, C++는 초단위로 재고 java는 밀리초단위로 재면 C++이 훨씬 불리하게 되겠죠...

그리고 상식적으로 생각해봐도 같은 단순한 사칙연산을 하는데, java가 c++보다 빠르면 비정상 아닌가요? 인터프리터랑 컴파일러 차이인데...

chaeso의 이미지

저는 컴파일러에 대해선 잘 모르지만
Java 는 실시간 optimization 을 한다고 들었거든요..
그래서 단순한 쪽에서는 Java 가 유리할거라고 생각하는데..

plusme의 이미지

그쵸.. java의 hotspot 이나 jit 같은건 runtime에 optimizing 합니다. c/c++ 같은건 compile time에 optimizing을 할수밖에 없죠. 따라서 java가 무조건 c/c++ 보다 느리다는 건 편견이라고 생각됩니다. java가 어떤 분야에서는 더 빠를수도 있다고 생각됩니다.

plusme의 이미지

글구 hotspot 이나 jit도 runtime때 native로 동적 혹은 정적으로 컴팔 하거덩요..