Java가 C/C++보다 성능상 우월할수 있는 이유가 무엇일까요.
최근의 여러 BMT를 보면
JAVA가 C/C++ 과 같은 compile time assembling
language보다 우수한 성능을 내는 경우를 심심찮게 볼 수 있습니다.
특히나 단순 반복적인
수학 시뮬레이션 같은 곳에서 이런 점이 두드러지고
최근에는 그동안 크게 안좋다고 생각되어 왔던 IO 부분이나
GUI 부분역시 비약적인 발전을 한것 같습니다.
특히나 같은 알고리즘을 C/C++과 같은 보다 저수준의
언어로 구현하는 것보다 Java로 구현하는 것이
*일반적으로* 더 생산성이 있다고 생각되어지는 점과
맞물려
이런 Java의 장점은 더욱 빛을 발하는것 같네요..
(기본적인 Performance역시 비슷비슷한 상황에서 알고리즘 마저 좀더 쉽게 구현할 수 있다면 어떤 problem을 푸는데 있어서의 overall performance 역시 더 높아질 가능성이 크다는 것이지요..)
그런데 이런 Java의 performance향상은
JIT나 HOTSPOT으로 대변되는
runtime-compiling / runtime optimization 기술로
인해 이루어 졌다고
생각되는데..(기존의 pure interpretation 방식에 비해)
이러한 runtime, dynamic optimization이야
C/C++ 도 하드웨어의 도움을 받아서 하고 있지 않나요?
scoreboarding이나 Tomasulo approach, reorder-buffer 류 말이져..
더군다가 C/C++ 역시 profile based optimization도 가능한
입장에서 C/C++ 역시 runtime optimization을 어느정도
행할 수 있다고 생각되는데......
그런데 여전히 BMT상으로는 Java가 어떤 측면에선
C/C++ 보다 빠르다 이거져...
HOTSPOT이나 JIT 의 무엇이 Java를 이렇게 빠르게 해놓았을까요..
HOTSPOT이나 JIT가 근본적으로 hardware based dynamic scheduling 기법과 어떤 차이점이 있는지 아시는 분 있나요..
runtime optimize 기술이 발달할 수록 자바가 앞서는 일부 영
runtime optimize 기술이 발달할 수록 자바가 앞서는 일부 영역들이 늘어나긴 합니다만 대부분의 자바 vs C/C++ 벤치마킹은 믿을 게 못됩니다.
- 죠커's blog / HanIRC:#CN
원래 마케팅이라는 게 그런 거짓말을 하는 거기 때문이지요. :P
원래 마케팅이라는 게 그런 거짓말을 하는 거기 때문이지요. :P
그런 테스트들은 대부분, 특히 아주 큰 차이를 보이는 테스트의 경우 공정한 테스트가 아닙니다. 애초에 공정한 테스트가 불가능하긴 하지만, JIT이 최고로 효과를 발휘하는 예제 코드를 사용하고, C/C++에서는 코드상 그런 최적화를 하기 어렵게 되어 있거나 최적화를 하지 못하는 툴을 사용한다면 당연히 자바가 더 뛰어나겠지요..
[quote="CN"]runtime optimize 기술이 발달할 수록
위에서도 말씀 드렸다 시피
runtime optimization은 하드웨어에서도 하고 있습니다.
즉, C/C++ 도 runtime optimization의 혜택을 받고 있고
이런 측면에서 Java만의 이점은 아니라고 봅니다.
이미 AMD에서는 K5 에서부터.. 인텔에서는 P6 코어에서부터
dynamic scheduling이 있어왔습니다
그리고 대부분의 Java vs C/C++ 의 BMT가 믿을 것이
못된다고 하셨는데
좀 잘 이해가 안되네요..
제 생각에는..
특정 기능을 수행하는 코드의 성능이 언어의 구조에 따라 달라지기 때문 아닐까요? 수치연산 분야에 있어서 그 종합적인 가용성을 Java vs Fortran 으로 비교한다면 정당한 비교가 되겠습니까? Java진영에서 발표한 자료는 Java측에 유리하게되어 있고 C++ 측에서 발표한 자료는 C++ 측에 유리하게 되어 있습니다.
Java가 성능상 눈부신(!!)성장을 해왔지만 BMT 결과를 일반화 시켜서 Java의 성능이 C++보다(or 만큼이나) 좋다(의도 하지 않으셨더라도)고 이해하시고 Flame War 성격으로 빠질까 걱정됩니다. =3
저도 Java가 왜 이렇게(?) 좋아졌는지 상당히 궁금합니다. :?:
http://redage.net
많은 BMT들이 소스 코드를 공개하고 조건을 명확히 명시하고 있기 때문에
많은 BMT들이 소스 코드를 공개하고 조건을 명확히 명시하고 있기 때문에 단순히 BMT는 다 못 믿겠다고 하는 것은 BMT에 대한 맹신만큼이나 현명하지 못한 판단입니다.
그리고 kldp에는 Flame 공포증이 좀 심한 것 같습니다. 외국 사이트의 경우 Java vs C++ 같은 주제가 심심찮게 논쟁 거리가 되는데 그 과정에서 서로 얻는 것이 아주 많죠. Flame이 될 것을 두려워하기보다는 대결 구도로 가더라도 배울 것이 많은 그런 논쟁으로 이끌도록 노력해야하지 않을까요.
http://c2.com/cgi/wiki?LanguagePissingMatch 같은 논쟁이 kldp에도 나올 수 있으면 좋겠군요.
Hardware 에서 하는 Run-time optimization보다
Hardware 에서 하는 Run-time optimization보다
Software 에서 하는 Run-time optimization쪽이
보다 High Level이니까 Flexible한 점은 있지 않을까요.
Profiling 정보도 가지고 돌아갈 수 있을 것 같은데요.
Branch Prediction도 더 잘 할 수 있을 것 같고요.
물론 Daemon처럼 장시간 돌아가는게 아니라면 별로 의미가 없겠지요.
Run-time optimization 관련 논문들을 아시는 분들이 계시면
좀 추천해주시면 이 글타래의 퀄리티가 좀 높아지지 않을지. ^^a
프비에서는 java 5.0 버전을 깔고 (linux버전) 돌리니 에러를
프비에서는 java 5.0 버전을 깔고 (linux버전) 돌리니 에러를 내더군요.
방법이 있습니까?
프비 버전은 따로 없는지라... 쩝.
길시언 아저씨 데비안으로 깔아줘....
[quote="plusme"]runtime optimization은 하드
dynamic scheduling은 뭔지 잘 모르겠지만 java의 runtime optimization은 software적인 것으로 알고 있습니다.
c++이 평균적으로 이렇게 코드를 짜는게 좋다는 통계적인 이유로 코드를 결정한다면 실제 수행환경의 변화를 보면서 이렇게 결정하는 것이 가장 훌륭하다는 쪽이 java인 걸로 알고 있습니다.
그런 방법을 통해서 일부 수치 연산의 속도는 꽤 훌륭하다고 알고 있습니다만 GUI등의 속도는 여전히 매우 느립니다. (상대적으로 본다면)
악의 적인 이유로 BMT를 한다면 최소 30% 최고 2배까지 성능차이가 나게 만드는 것은 어려운 일은 아닙니다.
벤치마킹은 언어의 모든 속성과 모든 환경을 고려할 수 없습니다.
Java가 C/C++ 보다 높게 성능이 나온 부분을 골라서 (특히 차이가 많이 나는 부분) 그것을 집중 적으로 구성하면 2배의 성능을 내는 것은 무리가 아닙니다.
Lisp같은 언어에서 재귀구문을 만들고 stack 위주의 call을 하는 언어들에서 재귀구문을 만들어 실행시간과 공간 비교를 한다면 Lisp이 질 수가 있을까요? 이런 테스트 결과로 C/C++은 Lisp보다 30% 정도 느린 것으로 판단된다라고 글을 적는 것이 벤치마킹입니다.
부분 별로 이 부분에서 이렇구나 취사선택을 할 수 있겠습니다만 대부분의 유저들은 그 자료에서 "승자가 누구인가?" 만 판단하더군요.
- 죠커's blog / HanIRC:#CN
[quote="plusme"][quote="CN"]runtime opti
하드웨어에서 제공하는 runtime optimization은 C/C++이나 자바나 모두 동일하게 영향을 받습니다.
소스 레벨에서 (C/C++이나 자바언어에서) 동일한 일을 하는 코드가 있다면, 컴파일러에 의해서 생성된 binary code에 따라서 성능차이를 보일 뿐 입니다. 즉, C/C++ 컴파일러가 더 빠른 binary code를 생성하는냐, JIT가 더 빠른 binary code를 생성하는가에 따라서 성능 차이가 생기는 것 입니다.
C/C++은 static 변환이기 때문에 profile에 따른 최적화를 따로 해 주어야 합니다.
그에 반해 SUN의 Java Virtual Machine은 run-time에 profile을 하고 있다가, JIT를 통해서 자동으로 최적화를 수행합니다.
따라서, profile을 통한 성능향상이 많은 프로그램의 경우
C/C++에서 최적화를 해 주지 않으면 Java에서 성능이 좋을 가능성이 있습니다. 둘다 최적화를 충분히 한다면 결과가 다르겠지만요.
이런 점 때문에 Java가 생산성(성능이 아니고)이 좋다고 이야기하는게 아닐까요?
@UX... Vnn~
[quote]부분 별로 이 부분에서 이렇구나 취사선택을 할 수 있겠습
그렇죠. 문제는 바로 이겁니다. 사실 벤치마크들은 대체로 벤치마크의 조건, 과정들을 명시하고 결론도 제한적으로 서술해놓고 있는데 유저들이 이걸 뭉뚱그려 판단해버리죠. 그것도 특히 기자들이 말이죠. 웬지 다음 쓰레드가 다시 생각나는군요.
http://bbs.kldp.org/viewtopic.php?t=54372
[quote="creativeidler"]그리고 kldp에는 Flame
I totally agree with your argument. ^^;
슬쩍 훑어봤는데 재미있는 내용이 많을 것 같은데요. 소개글이 아주 인상적입니다.
[quote="vacancy"]Hardware 에서 하는 Run-time
한표 ^^
일단 하나의 플렛폼에서 JAVA와 C++의 속도를 논하는것은 C++컴파일러와 JIT의 컴파일러차이 그이상 그이하 아무것도 아니겠지요
하지만 JAVA의 장점은 역시 Flexible하다는것..
예를들어 SSE2명령어를 사용하면 더 빠른 루틴에서
C++라면 SSE2명령어를 사용할수 없는 환경을 고려해서 컴파일시켜야할 경우도 있지만 JAVA는 그렇지 않겠죠.
지금 당장은 그점이 차이를 만든다고 생각하지는 않지만...
어째뜬 분명한건 미래지향적인 방식은 JAVA적인것이고
앞으로 기존 C++는 쇠퇴하고 JAVA의 JIT같은 방식이 더 널리 쓰이겠죠.
추가로 하나 더 의견을 내자면 Microsoft에서 개발하긴 했지만
지금은 EMCA표준이고 ISO에 상정된 IL을 적극 수용했으면 합니다.