자바 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.
단순히 눈으로
단순히 눈으로 봐도,
java 쪽의 결과는 좀 이상한데요?
혹시 sun의 jdk말고 다른거 쓰셨는지요?
제경우에는 거의 대부분의 성능 테스트에서 처음 한번은 매우 느리게 실행되고, 그다음부터는 빨라졌던거같은데요.
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
sun 의 jdk 입니다..
sun 의 jdk 입니다..
HotSpot 최적화 옵션을 주면 달라집니다.
최적화 옵션을 주면 달라집니다.
저의 경우는 (loop 를 5번이 아니라 15번 돌게 했습니다)
먼저 client vm 의 경우
purple@localhost:~/speed$ java Speed_K
Elapsed time:1409
Elapsed time:1360
Elapsed time:1348
Elapsed time:1381
Elapsed time:1346
Elapsed time:1393
Elapsed time:1348
Elapsed time:1377
Elapsed time:1349
Elapsed time:1378
Elapsed time:1358
Elapsed time:1446
Elapsed time:1459
Elapsed time:1376
Elapsed time:1362
server vm 인 경우
purple@localhost:~/speed$ java -server Speed_K
Elapsed time:1853
Elapsed time:1873
Elapsed time:42
Elapsed time:42
Elapsed time:43
Elapsed time:42
Elapsed time:42
Elapsed time:42
Elapsed time:41
Elapsed time:42
Elapsed time:42
Elapsed time:42
Elapsed time:41
Elapsed time:41
Elapsed time:42
가 나왔습니다.
JVM 은
purple@localhost:~/speed$ java -server -version
java version "1.6.0"
OpenJDK Runtime Environment (build 1.6.0-b09)
OpenJDK Server VM (build 1.6.0-b09, mixed mode)
입니다.
저와 환경이
저와 환경이 다른면이 있겠습니다만..
제가돌려보니..
test_src]$ java -server Speed_K
Elapsed time:1075
Elapsed time:1066
Elapsed time:492
Elapsed time:492
Elapsed time:516
두번은 같고 세번은 반정도 줄었습니다..
그래도 2배정도의 성능차는 나네요
또한 자바또한 최적화룰이 적용된거같은데..
C 도 -O3 옵션으로
C 도 -O3 옵션으로 컴파일실행한 결과좀 올려주실수 있으신지...
최적화 option을 다양화시켜서 측정할 필요가 있을 것 같은데요.
예전의 제 경험상 -O3가 -O2보다 항상 느렸었습니다.
지금은 또 많이 상황이 변했을테지만요.
Program의 특성에 따라서 -O1이 -O2보다 빠른 경우도 있다고 들었습니다. (Visual C++의 경우)
Code size를 위주로한 최적화가 cache 적중률을 높이기 때문이라죠.
제 생각에 공신력 있는 test들은 역시 앞서 소개되었던 site들이 아닐까 싶네요.
지금 이 논의는 상당히 지엽적인 수준을 이야기하고 있을지 모르겠습니다.
올리신 code에 대해서 집중해서 논의를 하고 싶은 것이라면 의미가 있겠습니다만...
딱히 정한다기보다
딱히 정한다기보다 어느정도 빠른방법으로 옵션을 선택해야겠죠...
site에 소개된 내용을 무조건믿을수는 없다는것입니다.
더구나 그site 들은 자바site 니까요..
지엽적일수 있습니다. 하지만 그건 java site 에서 제시한겁니다.
그만큼 java 가 유리한 특수한경우를 테스트해보는겁니다.
C의 경우입니다.
C의 경우입니다.
purple@localhost:~/speed$ gcc -O3 speed_k.c
purple@localhost:~/speed$ ./a.out
Elapsed time:0.342452
Elapsed time:0.319901
Elapsed time:0.329845
Elapsed time:0.344676
Elapsed time:0.330628
Elapsed time:0.330346
Elapsed time:0.330183
Elapsed time:0.333312
Elapsed time:0.329467
Elapsed time:0.329447
Elapsed time:0.331011
Elapsed time:0.329315
Elapsed time:0.330824
Elapsed time:0.332722
Elapsed time:0.330069
purple@localhost:~/speed$ gcc --version
gcc (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu7)
Copyright (C) 2007 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.
(썩은 떡밥?)
http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=gcc&lang2=java
gcc 옵션은 -O3 -fomit-frame-pointer -march=pentium4라고 합니다.
썩은떡밥? 옵션이
썩은떡밥?
옵션이 정확히 어떻게 작동하는지까지야 알수 없지만
전 AMD 인데도 성능차이 많이 나거든요...
-march=athlon64
-march=athlon64
프비 매니아~
제가 썩은
제가 썩은 떡밥이라고 한 이유는 이미 이런 주제가 많이 올라왔기 때문이죠. 어떤 식으로든 결론은 생산성이 중요한 경우에는 자바를, 성능이 정말 크리티컬한 경우는 C/C++를 써라, 어떤 경우에는 자바가 더 빠를 수도 있다...로 나는 것 같습니다.
그리고 이런 벤치마크는 환경이나 수행하는 작업에 따라 엄청난 차이가 날 때도 있으니까 별 의미 없다는 겁니다.
혹시 장장 7페이지에 달하는 토론을 다시 하고 싶으신건가요? http://kldp.org/node/73324
눈아파 죽겠네요.
눈아파 죽겠네요. 괜히 클릭하는 바람에 저거 7페이지 다 읽었습니다. -_-a
두페이지째 부터는 안볼라 그랬는데, 보던게 아까워서 조금만 더 하다가...
며칠전에 누군가가 국내 모 항공사에서는 90년대 초반까지 어셈블리로 어플리케이션을 개발했다고 하는 이야기를 듣고,
말도 안되는 소리라고 하고 넘어간적이 있는데... 저거 읽다 보니 그럴 수도 있을 수 있겠다는 생각이 드네요. ㅋㅋ
--
Jeong
http://www.pdfpro.co.kr/blog/jeong
--
Jeong
http://www.pdfpro.co.kr/blog/jeong
Re:
제가 듣기로는 British Airway도 90년대 중후반까지는 어셈블리어를 사용했다고 하더군요.
저글에도 있듯이..
저글에도 있듯이.. 자바가 생산성이 좋다는 근거는 없다고 봅니다.
수행하는작업에따라 자바가 빠른경우도 있을것같지만 그걸 C로 했으면 더빠르게 될것이라는거죠..
100번을 다시토론한다고 나쁜가요? 길고짧음은 가려봄직하고 서로가 다르게 알고 있다면 정답도 있을겁니다.
그걸 알아가는게 나쁜가요.. 전 근거없이 이건이러니 이유는따지지말고 그런줄알고 더이상 말하지말라 라고하는게 더이상하다고 보는데요..
Re:
1 일반적으로 C로 만든 어플리케이션의 실행 속도가 자바로 만든 어플리케이션의 그것보다 빠르다고 평가받고 저도 그것에 동의합니다.
2 그러나 프로그래머의 생산성과 프로그램의 실행 속도는 서로 다른 개념입니다. 생산성의 정의와 그것을 측정하는 방법에 관해서 SE 책을 한 번 참고하시기 바랍니다.
3 자바는 메모리 관리나 포인터를 없앰으로 해서 C보다 생산성이 좋다는 것이 일반적인 평가이고 저도 그것에 동의합니다.
:"자바는 메모리
자바는 메모리 관리나 포인터가 없어 기호화되고 더함축적이지 못하며 필요한경우 메모리를직접컨트롤할수없어 생산성이 떨어진다고 봅니다.
최소한 C는 자바처럼 구현할수도 있으니 자바보다 못할이유는 없다고 봅니다.
다른 분들이 말씀하시는 '생산성' 과는 의미가 달라보입니다.
같은 단어로 다른 의미를 두고 토론을 하면 더 이상 토론이 진행되지 않습니다.
어떤의미로
어떤의미로 말씀하신건가요..
select99님의 생산성은
select99님의 생산성은 "프로그램 수행 속도"를 의미하고,
다른 분들의 생산성은 "어떤 일을 하는 코드를 얼마나 더 빨리 짤 수 있는가"입니다.
Java로 할 수 있는 일을 C/C++로 못한다거나 혹은 더 빨리 "작동"하게 만들 수 있다는 의미가 아닙니다.
Java로 짜면 C/C++보다 같은 일을 하는 프로그램을 "더 일찍" 작성할 수 있다는 겁니다.
그럴 수 있는 이유중에 하나는, Java로 작성할 때는 C에서 처럼 메모리 릭을 방지하는 코드를 작성하지 않아도 되기 때문에, 신경쓸게 줄어들거든요.
JVM은 작동중에 스스로 최적화를 합니다.
일반적으로 Java에서 웹 애플리케이션을 작성할 때, 정적인 파일(이미지, *.js, *.css)등은 C로 짠 아파치가 처리하게 하고, JSP/Servlet 처리는 Java WAS(Tomcat)가 처리하도록 설정을 하는데요, 왜냐면 정적 파일 서빙은 C로 짠 아파치가 훨씬 빠르거라고 생각하기 때문이지요.
그러나 O'Reilly에서 나온 Tomcat Definitive Guide 2nd Edition ( http://oreilly.com/catalog/9780596101060/index.html )에 따르면 그게 낭설이라고 합니다.
Tomcat(Java로 만들어진 웹 서버/JSP/Servlet 처리기)과 Apache 2로 정적 파일 전송 테스트 결과 장시간 테스트를 반복하면 Apache 2 보다 Tomcat 6의 정적 파일 서빙 속도가 더 빠르다는 결과가 나옵니다. 정확한 원인은 모르지만, 저자의 의견에 따르면 JVM의 수행시 최적화 때문에 이런 현상이 나오는게 아닌가 하는 의견이 있습니다.
어쨌든 저도, 수행 속도 관련 논쟁은 더 이상 별 의미는 없는 것 같은데요..
http://kwon37xi.egloos.com
http://kwon37xi.egloos.com
님이
님이 오해하셨군요..
저또한 생산성을 님과 같은의미로 말한겁니다.
수행속도는 속도구요 생산성이란 얼마나 더빨리짤수 있는가를 두고 말한것입니다.
기호화되지 못했기에 코드작성이 느리다는것이구요.
메모리를 직접컨트롤할수없기때문에.. 동일한 성능의 프로그램을 작성하기위해 매우 난해하게 풀어가야한다는것이 결국 생산성(프로그래밍 자체가) 느리다는것 입니다.
자바로짜면 c/c++ 보다 같은일을 하는프로그램을 더일찍 작성할수 있다고 하셨는데.
자바로짠것은 c/c++로도 그대로 거의 흡사하게 짜진다는겁니다. 그런데 왜 자바가 더빨리짜지냐는거죠..
보통 웹에서 java로 동적페이지를 서비스한다는데.. c로 안하는이유는 java 가 그쪽에 이미 많이 진출했기때문에 lib 등이 풍부하다고 봅니다...
그러나 c가 웹lib 가 없는것도 아니며 속도가 떨어지지도 않습니다. fastcgi 라는것도 있구요..
c 가 웹쪽진출이 잘안됬던것은 c가 다른많은 분야가 있는데반해 웹쪽이 좀 노가다(?)성이 있어 개발자들이 비선호했었던 이유도 있을겁니다.
질문
어떤 뜻인지 해석이 잘 안되어서요. 혹시 언어차원에서의 syntax 지원하는 것이 적다는 것을 의미하시는건지요?
잘못 오해하면 '스크립트 언어가 C/C++ 보다 생산성이 느리다' 도 해석가능할 수 있을 듯 합니다만. 그리고 자바의 생산성은 자바 언어 자체보다 자바 + 개발환경을 같이 보셔야 할 것 같습니다. smalltalk 가 smalltalk 언어 신텍스만이 아닌 smalltalk 언어 환경을 같이 봐야 하듯이요. 실전에서 '동일 환경을 위해 VIM + Console 상태로만 비교하자' 하진 않을테고요.
자바도 그리 성에 차진 않지만, C++ 에서 Reflection/Introspection 을 이용한 Framework 가 있는지요? 저는 언어차원에서 이것이 지원되는 순간 프레임워크에서 다룰 수 있는 추상 정도가 다르다고 생각합니다. 혹은 AOP 같은 Meta-Programming 이라던지요.
덥썩
이 테스트에서는 아직 두 런타임의 기본(원시) 데이터 타입에 대한 정의가 확실하지 않기 때문에 정확한 테스트라고 볼 수 없습니다.
파닥파닥
-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.
물론C int
물론C int 32비트입니다. long 으로 해도 동일한속도가 나오죠.
자바의 경우 long은
자바의 경우 long은 signed 64bit, int는 signed 32bit 입니다만.
연산자나 원시 타입의 재정의가 불가능하다는 약점이 있습니다.
최적화를 모두 빼고 비교 한다고 해도 이런 퍼포먼스 비교에서 자바가 C보다 빠르거나 비슷한 속도를 내는건 불가능한 일입니다.
그렇다고 C코드를 자바와 같은 원시 타입을 쓰고 테스트 해야 한다고 하면 억지 부린다고 하시겠죠?
즉, 이런 퍼포먼스 테스트를 정말 할 필요가 있을까 생각이 듭니다.
ㅋㅋ
-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.
동일하게 32비트로
동일하게 32비트로 테스트해야 맞다고 봅니다.
한쪽은 32인데 한쪽은 64라면 불공평한거죠..
맛있는 떡밥이군요 :)
코드를 몇 줄 수정해봤습니다.
수정한 부분은 indentation을 달리했습니다.
---
다음은 실행 결과입니다.
환경입니다.
모드빈 커널인가여
모드빈 커널인가여 ㅋㅋㅋ
저도 바닐라 못쓴다는 ㅠ
프비 매니아~
XCODE 3.1이 나왔나요?
제 gcc는 5465빌드군요.
---------- 시그 *****
저도 세벌식을 씁니다.
M$윈도우즈, 리눅스, 맥 오에스 텐, 맥 오에스 클래식을 모두 엔드유저 수준으로 쓴답니다.
http://psg9.egloos.com
=================
잠못자는 한솔아빠
코드가 좀달라 거의
코드가 좀달라 거의 비슷하게 맞추고
데이터 size도 넣어봤습니다.
-------------------------------------------------------------
혹시 시간되시면 결과를좀..
흠..
저랑 내기할까요?
심지어 자바보다 느린 파이썬으로 저는 코딩을 할테니 다음과 같은 조건을 가진 프로그램을 짜주세요.
"랜덤으로 만들어진 문자열에서 1글자를 찾는데 걸리는 시간, 단문자열은 ascii 에 한한다."
"랜덤으로 문자 만드는 시간은 제외"
------------------------------------------------------------------------------------------------
Life is in 다즐링
------------------------------------------------------------------------------------------------
Life is in 다즐링
네. 일단
네. 일단 시간되는데로 해보죠..
랜덤으로만들어진 문자열에서 랜덤시간제외라고 했기때문에 그냥 디파인하겠습니다.
차후 다른요구사항이 있으리라보고 일단 이렇게만올립니다.
count = 15로만
[EDIT - error on prev. post]
changed count = 15
예를 들어 gcc에 core2 arch를 줄 수 있는 것도 최근 버전에서고, Java 1.6도 빌드 버전에 따라 HotSpot의 성능이 다르니 각각의 버전을 올려서 몇 번 더 테스트 해 보세요. 그리고 참고로...
http://weblogs.java.net/blog/kohsuke/archive/2008/03/deep_dive_into.html
http://blogs.sun.com/jag/entry/hotspot_performance
----
I paint objects as I think them, not as I see them.
atie's minipage
----
I paint objects as I think them, not as I see them.
atie's minipage
옵션을 -O3 이상으로
옵션을 -O3 이상으로 줘보실래요..
-O2 이하는 성능이 제대로 안나오는듯합니다.
저는 -O3로 제가 쓰는
저는 -O3로 제가 쓰는 패키지를 컴파일하지 않습니다. java 1.6 (어느 버전? or 1.7?) 이상에서는 HotSpot이 자동 적용이 되고, gcc의 -march=core2 -O2 옵션이면 제 기계에서는 안정적이고 그래도 최적화를 한다고 한 셈인데... 자바나 gcc 둘 다 최신 버전에 (둘다 거의 디폴트라 할 수 있는) 적당한 최적화가 적용된 비교라 제게는 위의 제 비교가 공평한 듯 합니다.
저는 dong1036님이 쓴 것처럼 왜 비교하는가 하는 쪽입니다. 위의 코드에 단순히 모든 sum 값을 줄별로 찍는 기능을 넣는다고 한다면 자바는 c에 비해 10배 이상은 족히 느립니다. 그런데, GUI 프로그램이라면 루프를 얼마나 빨리 돌고 printf를 얼마나 빨리 찍는지는 아시다시피 문제거리도 아니고요.
다만 제가 답글을 올리고 링크를 걸었던 이유는, 자바 1.6.0_01-b06 한 버전으로 비교해서 4배의 성능차가 있다고 이야기하는 것은 성급하니 버전을 올려서 몇 번 더 다른 테스트를 해 보라고 권했던 겁니다. (아마 그래서 글을 올린 것이라 짐작하고요.)
----
I paint objects as I think them, not as I see them.
atie's minipage
----
I paint objects as I think them, not as I see them.
atie's minipage
"sum 값을 줄별로 찍는
"sum 값을 줄별로 찍는 기능을 넣는다고 한다면 자바는 c에 비해 10배 이상은 족히 느립니다"
위코드는 그나마 자바site 에서 "자바는 느리지 않다" 라는 코드중의 임의로 선택한것입니다.
저도 왜 저런코드로 작성해는지는 모르겠습니다만.. 자바에서 빠르게 동작하는 특수한?코드라고하더군요..
그래서 얼마나빠른지 정말빠른지 직접해보고 싶었습니다. 과연 느리지 않는지..
직접해보니.. 거기서주장한 것과 다르게 매우느리게 나오더군요..
물론 몇군데서 해봤습니다. 모두 비슷한결과였죠..
그래서 자바site 에서 자바가 느리지 않다고 주장하는건 잘못된것이 아닌가라고 생각되어진다는겁니다.
더구나 저런특수한것에서도 차이가나는데.. 일반적이면 얼마나 차이가 더크겠냐는거죠..
제가 쓴 글의 부분을
제가 쓴 글의 부분을 인용하여 글을 전개한 것이 제게는 "이 분은 선입견을 갖고 있거나 의도적이구나"하게끔 느끼게 합니다.
제 테스트의 해석은,
c에서 -O2 최적화를 한다고 해도 예시된 코드의 수행은 3번째 루프 이후로는 자바가 30배쯤 빠르다.
입니다.
select99님의 결과가 그렇게 나오지 않는 것은,
사용한 자바 버전의 문제 또는 테스트 기계(AMD)의 CPU에 HotSpot의 최적화가 덜 된 탓이
이유입니다.
몇 군데 다른 테스트를 한 것도 올려봐 주세요. 비슷한 결과이면 적어도 제가 비교한 버전의 수행 결과를 AMD 기계에서 테스트 한 것을 올려봐 주시고요.
ps. 루프를 사용하는 것은 프로그램의 일반적인 경우입니다. 그게 특수한 코드이면, 그 루프 안에서 건 당 printf로 sum 값을 찍는 경우는 더 특수한 케이스가 됩니다.
----
I paint objects as I think them, not as I see them.
atie's minipage
----
I paint objects as I think them, not as I see them.
atie's minipage
최적화 옵션 잘 모릅니다만...
제가 O2, O3 뭐가 뭔지 잘 모르는 사람이긴 합니다만
Java를 HotSpot으로 돌리는 경우와 비교를 하려면
C 역시 Profile 기반의 최적화는 해야 격이 맞다고 생각됩니다.
gcc의 option에 따른 결과
gcc 컴파일 옵션 변경에 따른 결과값입니다.
소스는 원문 소스에서 변경한 것 없고
시스템은 Core2 Duo 6300에 Fedora Core 6입니다.
jdk나 gcc 버전은 아래 결과에 포함되어 있습니다.
제대로 컴파일 옵션을 주고 나면 속도가 비교가 안되네요.
=================================================
jhpark@crouter:~/a 176$java -version
java version "1.6.0_03"
Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
Java HotSpot(TM) Client VM (build 1.6.0_03-b05, mixed mode, sharing)
jhpark@crouter:~/a 31$java -server Speed_K
Elapsed time:0.997
Elapsed time:1.021
Elapsed time:0.387
Elapsed time:0.369
Elapsed time:0.387
jhpark@crouter:~/a 32$java -client Speed_K
Elapsed time:0.808
Elapsed time:0.807
Elapsed time:0.806
Elapsed time:0.807
Elapsed time:0.806
jhpark@crouter:~/a 178$gcc --version
gcc (GCC) 4.1.2 20070626 (Red Hat 4.1.2-13)
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.
jhpark@crouter:~/a 33$gcc -O2 Speed_K.c -o a
jhpark@crouter:~/a 34$./a
sizeof int=4 long=4
Elapsed time:1.451029
Elapsed time:1.370664
Elapsed time:1.453891
Elapsed time:1.370636
Elapsed time:1.451029
jhpark@crouter:~/a 35$gcc -O3 Speed_K.c -o a
jhpark@crouter:~/a 36$./a
sizeof int=4 long=4
Elapsed time:0.134384
Elapsed time:0.134390
Elapsed time:0.134395
Elapsed time:0.134375
Elapsed time:0.134376
jhpark@crouter:~/a 37$gcc -fprofile-generate -O3 Speed_K.c -o a
jhpark@crouter:~/a 38$./a
sizeof int=4 long=4
Elapsed time:0.976994
Elapsed time:0.976884
Elapsed time:0.976423
Elapsed time:0.976341
Elapsed time:0.976097
jhpark@crouter:~/a 39$gcc -fprofile-use -O3 Speed_K.c -o a
jhpark@crouter:~/a 40$./a
sizeof int=4 long=4
Elapsed time:0.000002
Elapsed time:0.000052
Elapsed time:0.000014
Elapsed time:0.000025
Elapsed time:0.000010
굳이 비교 안해도..
자바쪽에서 제일 느린 것은 IO쪽인데..
어차피 프로그래밍을 하면.. IO는 거의다 사용하지요.. ㅡ,.ㅡ ㅋ
아무리 NIO가 나왔다 쳐도.. C보다는 현격히 느린편이지요..
다른건 성능차이가 별로 없어도.. 이건 확연하게.. 성능차이가 있는데..
뭐 그렇다고요 ㅋㅋ
음 냐냐~
-O2, -O3 최적화 많이 쓰나요?
쓰고 싶어도 컴파일러마다 동작이 다르거나, inlining 을 잘못 처리하거나,
function call stack 이 제대로 안나오거나 해서요 (함수 호출에 대하여 call 대신
jmp 나 아에 inlining 해버리는지라..)
GC 가 기본 지원 되는 언어와 안되는 언어, Reflection & Retrospection 이 지원 될 때와 지원되지 않을 때 디자인될 수 있는 Framework 의 추상도 수준의 차이, Eclipse + Java 와 Eclipse + CDT 조합의 구현현황을 생각하면 (KScope 도 왠만한 자바 IDE 의 'Find Usage' 혹은 'Find Reference' 기능의 정확도에 비해 떨어집니다.) '자바가 생산성이 좋다는 근거는 없다' 는 말이 제겐 도무지 와닿지 않네요.
call stack이 제대로 안
call stack이 제대로 안 나오는 거야 디버깅할 때 문제가 되는 거니까 디버깅할 때만 끄면 되고, inlining이 잘못 처리된다는 건 무슨 의미입니까? 적어도 제가 아는 한 인라인화 때문에 프로그램의 의미가 바뀌는 일은 없습니다. (심지어 항상 인라인화가 되는 함수라도 포인터를 취할 경우 그 코드는 남습니다.) 혹시 어셈블리와 섞어 쓰시는 걸 말씀하시는 걸지도 모르겠군요.
Re:
저는 gcc 컴파일러에서 -O3 옵션을 사용하면 모든 함수를 인라인 함수로 취급하고 그리고 지나친 최적화로 인해 프로그램 기능의 왜곡의 가능성이 있다고 들었습니다. 제가 들은 것이 맞습니까?
-finline-functions 옵션이
-finline-functions 옵션이 켜지는 걸 말씀하신다면 아닙니다. 이 옵션이 켜지면 gcc는 작은 함수에 대해서 인라인화를 할지 하지 않을지 경험적인 방법으로 결정합니다.
그나저나 -O3을 켰다가 정말로 뒤통수를 맞은 적이 한 번 있긴 한데, 이 때는 프로그램에 버그가 있던 것이 나타나지 않았다가 최적화를 하고서야 나타난 것으로 나중에 확인되었습니다. (처음 봤을 때는 최적화가 프로그램 깨먹나 했죠.) 다른 경우는 아직 본 적이 없네요. 아, 컴파일러 버그는 자주 봅니다. C++ 템플릿으로 별 짓을 다 해서요 -_-;
call stack
call stack 이 제대로 안나오는 것이 꼭 '디버깅 때' 만 문제가 되질 않습니다. 유지보수를 위해 프로그램이 외부로 배포 된 뒤 문제가 발생했을 경우 call stack 이나 function pointer list 를 로그로 남깁니다. (윈도우즈의 경우 mini dump 나 Bug Trap 등을 이용하죠. http://www.codeproject.com/KB/applications/BugTrap.aspx) 모든 프로그램이란 한번에 완벽할 수 없기 때문입니다. 그래서 종종 프로그램의 초기 버전에서는 release 컴파일을 하더라도 전역 최적화 옵션을 끄거나 디버깅 정보를 남기기도 하죠. (보안 문제가 걸리는데, 이건 다른 논의로 해두죠)
그런데 최적화 옵션(O2,O3) 가 활성화 될 경우 앞에서 말씀드린대로 inlining 되면서 일부 call trace 남은 것들이 합쳐져버립니다. 안정화된 프로그램이면 몰라도 초기 버전의 경우 배포 뒤 유지보수 때 어려움이 있습니다.
그리고 컴파일러의 공격적인 최적화나 혹은 컴파일러의 버그로 inlining 이 잘못되는 경우가 종종 있습니다. 컴파일러도 결국 '프로그램' 이다 보니, 버전 별 혹은 플랫폼에 따라 어느정도 버그들은 있습니다. 개발하는 쪽이 최대한 안죽고 잘 버텨야 하는 서버 프로그램인지라 문제가 되었었고, 결론은 '컴파일 옵션보다는 아키텍쳐나 최적화된 알고리즘으로 해결하자' 가 였습니다.
디버깅 정보를
디버깅 정보를 남기기 위함이라면 뭐 이해는 하겠습니다만, gcc를 쓰신다면 아마 -fno-inline-functions 옵션으로 인라인화를 피해 갈 수 있지 않나 싶습니다. 빠른 컴파일을 위해 -O2를 쓸 수도 있는 것이니까 선택의 문제겠네요.
컴파일러에서 최적화를 하다가 뻗는 문제는 -- 위에서 말했지만 실제 프로그램의 버그 때문에 그런 거 말고 -- 아직 겪은 적은 없습니다. 컴파일러 버그는 오히려 언어의 obscure한 부분(C++ 템플릿 약간 복잡하게 썼다고 터지더군요. 그 이후로 boost만 씁니다.)을 건들 때 더 많이 나타나는 것 같습니다. C/C++ 공부가 아직 부족한 걸지도 모르겠습니다 ;)
Comeau사 꺼 사셔야 할 듯... ^_^
아, 그러면 다른 사람들과 작업하기 곤란한가? -_-.
언어 자체의 구현이
언어 자체의 구현이 아예 없는게 아니라 있는데 좀 큰 케이스에서 작동을 안 해서요. 최근에는 아예 C++를 버린 터라 gcc 4.x 대에서는 어떤지 모르겠습니다.
gcc 에선 생각이 잘 안나고..
Visual C++ 의 경우 O2 옵션에 전역 최적화 옵션이 포함되어 있습니다.
이를 끌 경우 inlining 은 막을 수 있습니다. 단, 성능이 20-40% 차이가 납니다.; 특히 메모리 복사가 잦거나 Memory Map File 통한 공유메모리 통신시에 차이가 많이났습니다. 물론 function depth 가 깊은 경우에도 영향을 끼쳤겠죠.
p.s. 회사에서는 STL, Boost, Template 안씁니다. 멀티 플랫폼 포팅 문제 때문에라고 들었습니다. gcc도 솔라리스 버전과 리눅스 버전이 동작이 다를 수 있다고 합니다.
그래서 어떤 분은..
callstack 대신 Binary Hex Dump값을 남긴 뒤, 이 덤프된 Binary 값을 보고 대략 어떤 함수 부분일 것이라 추측하신다고 하네요.;
아직 그 경지까지는 시도를 못해봐서..;
저 같은 경우
저 같은 경우 의심되는 함수에다가 __asm__ ("int $3; int $3; int $3;"); 같은 것을 넣어서 보곤 했습니다. (x86 어셈블리 얘기. int $3이 아니라 nop 같은 것도 써 봤지만 최적화하다가 사라지는 경우가 어쩌다 있더군요.) 사실 objdump만 있어도 어셈블리 아는 사람은 대강 함수 내용은 때려 찍을 수 있긴 하죠;
흑. 잘못썼군요. Retrospection -> Introspection
왠 난데없는 회고를 하고 그랬지. -_-;;
제일 좋은
제일 좋은 방법은...
그냥 C를 쓰시는 겁니다.
전 그냥 자바를 쓰겠습니다.
----
the smile has left your eyes...
----
the smile has left your eyes...
KIN~ 인가요? ^_^
진담이시라면 너무 냉소적이신 것 같구...
농담이시라면 유쾌하네요.
select99님이 원하시는데로 어느 정도 불붙은 것 같군요.
참고할만한 내용이 많이 나오기를...
KIN이라기
KIN이라기 보다는
뼈있는 농담이죠~ ㅎㅎ
----
the smile has left your eyes...
----
the smile has left your eyes...
자바쓰쎄요.. 전
자바쓰쎄요..
전 말린적없습니다.
또한님이 쓰라고 궂이 써라마라 안하셔도 전필요한것 있으면 그것씁니다 물론 자바도 예외일순 없죠...
자바의 잘못된정보가 파해쳐지는것이 두려우신건 아니신지요..
닉네임다운 명쾌한
닉네임다운 명쾌한 답인 것 같네요~
울티마를 생각하며^^;
──────────────────────────────────
이런류의 글은
이런류의 글은 언제나 속도에만 관심을 가지는 것 같습니다.
메모리 사용정도는 비교대상조차 될 수 없기 때문일까요...
메모리나 초기 vm
메모리나 초기 vm 구동시간은 자바가 매우 불리할것같은데요..
JAVA 와 C 의 비교.
잊을만 하면 한번씩 올라와서 잼있게 해주는 주제네요.
Jave는 문법만 대충 알 고 있는 C++ 개발자로써...
한 2,3년전부터 J2EE 개발하는 프로젝트에 혼자 와서 C++ 로 이런저런거 개발중에 있습니다.
제가 옆에서 Jave 개발을 지켜보며 받은 느낌으로는 Java는 C++에 비해 느림 이상으로 느리다는겁니다.
쬐그마한 코드 최적화해서 속도 비교해보는 것 이상으로 실제 프로젝트에선 더욱 더더더 느리다는거죠.
기본적으로 메모리 사용양도 비교 자체가 안될정도로 훨씬 더 많고...
프로젝트가 커질수록 이런저런 오버헤드가 붙어서 더욱 더 느려지더군요.
OOP 적인 매력은 Java 가 멋진데... C++ 과 속도 비교할 대상은 아닌것 같습니다.
역시 간만에 다시
역시 간만에 다시 한번 재미있는 떡밥이...
Java와 C의 비교는 결국 vm과 컴파일러의 실행속도 비교가 되어 버리는 경우가 많아서 큰 의미는 없다고 봅니다.
Java의 의미는 소프트웨어 작성과 유지보수 시간을 줄여준다는데 있다고 봅니다. Java가 본격적으로 쓰이기 전인 90년대 중반 미국에서는 C/C++로 작성된 프로그램들의 메모리 오류로 인해서 어마어마한 비용이 지출되고 있다는 Software Crisis에 대한 지적이 많았었던 것으로 기억합니다. 어찌보면 자바가 그런 소프트웨어 위기를 넘기는데 한 몫을 하고 있다고 보고요, C/C++ 쪽에서도 여러가지 해결책들이 나와서 결국 소프트웨어 업계 전체적으로는 긍정적으로 작용했다고 봅니다.
그리고, 근래의 비지니스 어플리케이션 소프트웨어들은 DB 중심적인 것들이 대부분이라서 사실 개발 언어의 퍼포먼스를 논하기 이전에 DB에서 충분한 실행시간을 까먹어 주기 때문에 더욱 Java가 쓸모 있는 도구가 된 것 같습니다.
물론 저는 고슬링이 재수 없다는 이유만으로도 Java가 꺼려져서 여전히 C/C++/Python/PHP 같은 것들을 주로 씁니다만... ^^
=-=-=-=-=-=-=-=-=
http://youlsa.com
=-=-=-=-=-=-=-=-=
http://youlsa.com
근데 지금 테스트에
근데 지금 테스트에 사용되는 저런 종류의 코드를 실무에서 사용하시는 분 계신가요?
런타임 최적화라는 것이 동적인 입력에 대해서도 항상 올바른 결과를 보장하면서도 빠른 성능을 기대할 수 있나요?
예를 들어 DB에 10만개의 랜덤값을 놓고 그걸 랜덤하게 가져와서 연산을 한다거나 할 때도 역시나 최적화된 성능을 기대할 수 있는건가요?
정말로 잘 몰라서요;;;
"제시하신" 테스트
"제시하신" 테스트 코드를 "제시하신" 실행 및 컴파일 옵션으로 "제시하신" 플랫폼에서 실행했을 때 성능 테스트 결과는 님께서 주장하시는 바가 맞습니다.
자바가 씨 만큼의 성능이 나온다고 주장하는 사람들의 논지는 일반적인 복잡도를 가진 루틴이 양쪽의 경우 모두 쓸만하다는 뜻으로 주장하는 것이지, 모든 경우에 자바가 씨만큼의 속도가 나온다고 주장하는 것이 아닙니다.
추상화 레벨을 생각해 보면, 씨 코드를 자바 코드로 동일하게 옮기는 것은 "불가능합니다". 어렵다는 뜻에서가 아니라, 논리적으로 불가능합니다. 컴파일러가 생성하는 네이티브 원시 코드를 세세하게 제어할 수 있는 저급 언어의 특성을 씨는 가지고 있는 반면, 자바는 JVM을 거치죠.
극단적으로 씨는 주의를 기울이면 위처럼 단순한 반복적인 루틴의 경우 CPU의 레지스터 갯수와 인스트럭션, 데이터 캐시 크기에 의존해서 최적화하는 것도 불가능하지 않습니다. 실제로 커널 개발자들은 그런 것들도 고려를 하는 경우도 있구요. 씨를 "포터블한 어셈블리"로 사용할 수도 있다는 거죠.
그래서 씨로 짠 코드가 자바보다 빠르다는 테스트를 하는 건 크게 의미가 없다고 봅니다. 자바가 씨보다 빠르다는 테스트는 JVM의 성능 개선을 보여 줌으로써 추상화 된 계층의 최적화 기술을 보여주는 좋은 증거이지만, 그 반대는 아무것도 보여주지 못하기 때문입니다.
히히
정말 오랫만에 다시 수면으로 올라온 떡밥이네요.
그럼에도 댓글이 참 건설적으로 흘러가는군요.
생산성이라는게 어떤걸 개발하느냐에 영향을 안받을수 없는것 같습니다.
리눅스 커널을 보면 시스템콜추가나 네트워크 스택추가 같은게 정말 간단하면서도 ARM이나 인텔계열이 CPU를 많이 타지 않고 비슷비슷며, EXPORT 메크로등이 정말 잘 되어있어서 디바이스 만들기도 무척 쉽죠. 그걸 보면 리눅스 개발환경에서 C는 좋은 생산성을 낸다고 생각합니다.
그런데, 저보고 윈도우에서 Win32API로 JSR296급의 GUI어플리케이션을 만들라고하면 즐~ 하겠지요..
전체적으로 지금 수요가 많은 것이 자바로 만드는것이 빠른것들이라면, 현재 자바가 C보다 생산성이 높다고 말하는게 옳지 않을까요?
poklog at http://poksion.cafe24.com/poklog/
poklog at http://poksion.cafe24.com/poklog/
java나 C나 그 나물에
java나 C나 그 나물에 그 밥 아닌가요?
뭘 쓰던 적당한 시간(요구사항에 만족하는 응답시간) 안에 결과가 나오면 그대로 쓰면되고,
느리면, 최적화 하든지 기계 사양을 높이던지 하면 되는데...
취향(종교?)의 차이를 인정하지 못하고, 자기 취향을 객관화하거나 또는 정당성을 얻으려고 하면 많은 마찰이 있을 수 밖에 없습니다.
프로그래밍 언어, 에디터, OS 등등.
예전에는 (emacs교 신자인 저의) 부하직원이 vi도 아닌 ultra 에디터인가하는 것을 고집하면 박살을 내주곤 했는데, 요즘은 그냥 둡니다.
왜냐? 종교의 자유가 있거든요.
더불어 유닉스 파일을 윈도우로 가져다가 편집하고 다시 올리는... 막노동하는 신체의 자유도 중요하죠.
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
독실하시군요. ^_^
거의 모태신앙에 가까운듯...
자유는 정말 중요한 것 같아요.
http://openlook.org/blog/2007/04/05/cb-1160/ 의 마지막 code를 즐기는 분도 계신 걸 보면. ^_^.
요새는 version 관리도구 많이 쓰는 것 같은데 단순한 script가 아니면
이기종간 file 교환문제가 그리 문제되지는 않을듯...
저런 단순 비교는 별 의미가 없습니다. 그리고 Java가 C보다 빠를수 있습니다.
저런 단순 비교는 별 의미가 없습니다. 그리고 Java가 C보다 빠를수 있습니다.
Java는 VM을 거쳐서 거의 모든일이 수행됩니다.
일반적으로 OS내의 Loader 라든지 Linker 등의 기능이 VM내에 비슷하게 존재합니다.
VM init. 시 VM에서 사용하는 상당 부분의 Memory를 Host System으로부터 Allocation을 하고
이 Memory를 GC가 관리합니다. 물론 VM 실행 옵션을 어떻게 주느냐에 따라 이건 달라질수 있습니다.
하지만 C나 기타 Native Language들은 호스트 시스템의 System Call을 사용하여 직접적으로 메모리를 관리하게 됩니다.
C의 malloc/free 같은거 말이죠.. 이에 따라 malloc/free가 호출될때마다 System call이 일어나게 됩니다.
다들 아시겠지만, 많은 시스템에서 System call은 software interrupt로 구현이 되고, 이경우 대부분의 시스템에서
Context saving이 필요합니다. 물론 ARM같은데에서는 Multiple Register Set을 두어서 이를 하드웨어적으로 빠르게 하기위한
아키텍쳐를 갖고 있다지만, 분명 엄청난 오버헤드가 존재하게 됩니다. 물론 C같은데에서 JVM에서와 같은 GC를 직접 제작해서
메모리를 관리한다면 달라지겠지만, 이런것을 언어 자체의 보편화된 성격으로 일반화시킬수는 없을 것입니다.
반면 JAVA는 User Space의 메모리를 GC가 관리해줌에따라 실제 호스트 시스템으로의 System Call을 상당히 감소시킬수 있습니다.
메모리 사용량에 있어서는 분명히 단점이 존재합니다.
또한, Java의 HotSpot이나 JIT 등의 SW Runtime Opt. 기능은 C/C++ 과 같은 Static Opt. 밖에 할 수 없는 언어와는 분명 차별화된 특성이고
성능차이를 발생시킬수 있는 요인입니다. 특정 case로 많이 가는 Branch에서 해당 Branch의 순서를 바꾸어 Execution time을 최적화 한다든지 하는 건
C/C++에서는 추구할수 없는 장점이죠. 이러한 Runtime Opt. 기능은 실행시간이 긴... Server App. 등에서 더 빛을 발할수 밖에 없습니다.
위에서 제시한 단순한 코드에서는 그러한 장점을 별로 볼수가 없겠죠.
이러한 언어자체의 특성에서 오는 성능 효과뿐만 아니라
복잡한 알고리즘을 안전하게 코딩하기가 더 쉽다는것, 이런것이 가장 큰 장점이고, 이것으로 인한 성능 개선 효과도 무시할수 없습니다.
언어자체의 ThreadPool library 라든지, Syntax 상에서의 Concurrency 지원, 다양한 알고리즘을 지원하는 Data Structure 등등..
물론 이러한 것들을 이미 갖추고 있는 C/C++ 개발자들은 뭐 그게 장점이냐 하겠지만.
기본적으로 지원해주는것과, 개인적으로 갖고 있다는건 언어자체를 놓고 비교할때는 달리 취급해야 합니다.
아무것도 없는 상황에서 중급 Java 개발자하고, C개발자하고 하루안에 아무 채팅서버 개발을 하라고 하면,
Java 개발자는 언어자체에서 지원하는 ThreadPool Library를 쓰고, MemoryMapped Buffer 를 쓰고, MT-Accept, MT-Select 구조의 m threads per n sockets (m>=1, n>=1) 서버를
뚝딱뚝딱 만들겠지만.. C개발자는 아마 Fork 방식으로 만들지 않을까요.. 아마 성능차는 10배이상 나겠죠..(Java>C)
물론.
Java는 Multi-platform을 지향하는 언어이기때문에 각 플랫폼의 공통된 부분만 추구하죠.
이에따라 Platform-specific 한 기능인데 그 기능으로 인해 성능이 극대화 되는 그런거.. 그런건 뭐 C하고 Java하고 Game이 안됩니다.
예를들어, 3d Graphics라든지.. epoll 같은거?.. ㅎㅎ
근데.. 예로든 두개 모두 이미 Java안에 녹아들어가 있군요...
세상에 만능인 언어가 있으면 얼마나 좋겠냐마는..
그렇지가않죠. C는 C만의 강점을 가지는 영역이 존재하는거고. Java도 어떤 영역에서는 C보다 분명한 강점을 가집니다.
제가 생각하는 것과 몇가지 좀 다른데...
우선 malloc, free는 보통 system call이 아닙니다.
적당량 memory를 가져와서 user space에 할당하고 그 안에서 작업을 해주죠.
실행시간 최적화는 Java만의 전유물은 아닙니다. 그리고 그런 기능들은 요새 CPU와 OS가 많이 하죠... -_-..
어쨌든 Java의 VM의 성능개선으로 성능이 좋아질 수 있다는 것은 다들 동의하지만
C compiler의 성능개선도 있고, 정말 성능이 중요하다면 C program 개발자가 실행시간 최적화에도 신경을 쓸 겁니다.
여러가지 library는 표준 library가 아니더라도 C/C++를 위한 library가 많기 때문에
있다는 것 그 자체가 크게 장점이 되지는 않을 것 같네요.
저는 Java library들이 안정성을 추구하는 언어 기능들과 결합되어져 나오는 효과들이 맘에 들더군요.
아, 말씀하신대로 multi platform이라는 점도 함께...
fork를 나쁘게만 볼거는 아니죠. 일부러 fork를 쓰는 훌륭한 program도 많은데 말이죠.
물론
Hardware 적인 Run-time 최적화 하는건.. 뭐 한참됬죠..
OOO execution 얘기 나올때 부터니까요..
하지만, 아시다 시피 OOO Execution을 비롯해서 그러한 복잡한 하드웨어의 성능 개선 효율이 그리 좋지 못하다는
사실도 주지하는 사실입니다.
더군다나 이경우 Optimization Window 사이즈 역시 매우 제한적입니다.
그리고 이러한 Low-level의 Run-Time 최적화와 VM에서 행하는 Run-Time 최적화는 동등한 수준의 얘기가 아닙니다.
Low-level의 Run-Time 최적화는 C나 다른 랭귀지 만이 누리는 장점도 아니며, HW Platform 적인 얘기가 되겠죠..
그리고 C Programmer가 실행시간 최적화에 신경을 쓰면서 프로그래밍 하나요?...
실행시간 최적화를 Static한 상황에서 고려한다는것 자체가 모순적입니다.
또한, 최적화를 자동으로 해준다는 것과 Manual하게 한다는 건 디자인 자체의 엄청난 차이입니다.
여러가지 라이브러리가 표준화 되어 있다 하고, 존재한다는 건 큰 차이입니다.
C로 뭔가를 한다 하면 사실 Abstract Data Model을 뭘 사용해야할지
이걸 사용했을때 코드 배포는 어떻게 하며, 의존성 관리는 어떻게 할지..
이런거 다 신경쓰면서 해야한다는 얘깁니다.
기본으로 존재한다는 것과. 있을수 있다는 건 큰 차이 입니다.
솔직히 말씀드리면
전 공부가 부족해서 그런 실행시간 최적화의 이점을 제대로 본 적이 없습니다.
그래서 잘 알지도 못하면서 폄하를 했네요. 죄송합니다.
잘 아시는 사례가 있다면 소개시켜주시겠습니까?
제가 알기로는 실행시간 최적화가 주는 장점은 VM이 hardware에 적합한
code로 번역하기 때문이라고 들었습니다.
그런데 branch를 일일이 점검해서 그 순서까지 바꾸는 줄은 처음 알았군요.
그에 대한 성능개선 효율에 대한 문건을 아신다면 소개해주시면 감사하겠습니다.
폄하한지 몰랐는데요..ㅎㅎㅎ
그 Branch가 branch instruction을 얘기하는건 아니었습니다.
일반적인 language syntax 상의 conditional expression에서의 branch를 의미하는거였습니다.
해당 자료를 어디서 본적이 있는데 못찾겠네요..
Run-time 최적화는 비단 그러한 것만에 국한되지 않고.. 특정 객체의 Memory의 위치를 바꾼다거나(Heap<->Stack) 하는거까지도 해당되죠
다음은 C malloc vs. java의 new Object() 사이의 차이와 이로인한 Java의 성능 Boost-up을 설명한 글입니다.
참고가 되기 바랍니다.
http://www.ibm.com/developerworks/java/library/j-jtp09275.html
저도 한마디
저도 한마디 끼어들어도 될런지 모르겠지만.
제가 가장 자바가 마음에 안드는이유중하나입니다.
그다지 공감가지 않는이론들로 이론만 난무합니다.
사실하나하나따져봐야 끝까지 답을얻지 못하겠죠..
그렇게 백날 입으로 따질필요있나요? 테스트해보면되죠..
백날 어쩌고 저쩌고 말로만하면머합니까.. 실제성능이 안나오는데 말이죠..
그럼에도 불구하고 덧붙이면.. 최적화가 스테틱한최적화보다 유리한점이 존재한다고 장담하시겠죠?
여행을갈때 중간중간에 필요한물건필요한만큼 사서 쓰는것은 일종의 런타임시 최적화죠..
이게 더유리할것같지만 더욱완벽한 최적화는 여행출발할때 필요한만큼 최적의 물건을들고 이미 계획된만큼 돈도 가져가는것입니다.
돈을 전자만 소유할수있다고 생각하시는거나 다름없습니다.더구나 미연에 알지못하는상황이면 분명 여분의 돈을가져가야하기때문에.
미리 계획된여행보다 효율적이될리는 희박합니다.
최대한 미연에 미래의 최적화가 이루어지는것일수록 유리합니다. 자바는 이미 여행가방에 최적화판단모듈까지 집어 넣고 출발한셈입니다.
백문이 불여일견
백문이 불여일견 이란 말이 있죠.
말씀하신대로 실제 테스트 해보면 됩니다.
그런데 저런 간단한 코드 말고 복잡하지만 실제 비슷한 기능을 갖는걸로 테스트 해야 의미가 있습니다.
그냥 몇줄 안되는코드 짜봤는데 Java가 느리다.. C가 느리다.. 이런건 의미가 없습니다.
실제 같은 기능의 Web Server 를 짜서 시간당 Transaction 이나 Throughput 등을 비교해보는것이
가장 의미가 있습니다.
(이와 관련해서 2006년인가 2007년인가에 JavaOne에 발표된 NIO 관련 자료를 보시면 Apache 2 하고 Java NIO로 만든
웹서버 BMT 결과를 비교해 놓은게 있습니다. 관심있으시면 찾아서 보세요.)
하지만.. 이런 테스트는 근본적으로 힘듭니다.
그러기에 이론에 근거한 추론이 필요한겁니다. 공감이 안가는 이유는 공감하기 싫어서 또는 잘 몰라서라고 생각됩니다.
Static Opt. 와 Dynamic Opt. 에 대한 비유도 참 이상합니다.
Java는 Static Opt. 를 안할까요?...
세상에 컴파일링 언어 중에서 Static Opt. 안하는게 있을까요..? 학부생이 Term Project로 만든 Compiler는 그럴지도 모르겠습니다만..
이러한 Static Opt.와 더불어 Run-time 상에서도 최적화를 한다는 겁니다.
여행갈때 미리 준비 하는거 뿐만 아니라
여행갈때 가이드를 붙인다는 겁니다. 혼자 삽질하면서 돌아다니는게 아니라...
그래서 말보다는
그래서 말보다는 작지만 하나하나 실례를 보자는겁니다.
작은것은 작아서 전체를판단할수 없다 크면커서 안된다. 이런식으로 말로만할순없죠.
제가 애초했던말은 자바site에서 소개한 특수코드가 제가해보니 빠르지 않더라는겁니다.
"그냥 몇줄 안되는코드 짜봤는데 Java가 느리다.. C가 느리다.. 이런건 의미가 없습니다" <-- 이말은 자바site 적어야옳은듯하군요..
여행에 가이드까지 따라붙으니 비용은더욱증가하겠죠..
여행에 자신이 있으신가 보군요... ^_^
여기서 마무리해도 좋지 않을까 싶습니다.
어느정도 말하시는 바에 대해서 다른 사람들이 동의한 바도 있고요.
Java와 C의 성능논쟁은 C와 Assembly의 성능논쟁과 다를 바가 없어보입니다.
앞에 제가 썼던 글에서 소개된 site 들이란 다른 분들이 남기신 연결고리에 올라온 자료입니다.
물론 Java가 느리죠.
제가 잘 찾지 못한 것일지 모르겠는데 말씀하신 site 연결고리 부탁드립니다.
제 생각에는 거기서 C는 최적화 option을 안 준 것이 아닌가라는 생각이 드는군요... ^_^
인용하신 글은 Java의 성능에 대한 생각이지 말씀하고 계신 site의 글에 대한 동의가 아닌 것은 아실 겁니다.
생각이 있으시면 그 site에 문의를 해보시죠.
대형 program에 있어서 성능을 측정하고 그 원인 분석을 통해 비교 통계를 객관적으로 만드는 것은 확실히 어려울 겁니다.
그런거 있으면 대형 논문감이죠. 여기서 논의하는 것으로 답이 나오지는 않을 것 같군요.
그리고 이것은 다른 이야기인데 제가 오늘(어제?) MBTI 검사를 받았답니다.
INTP가 나오더군요. ^_^
그런데 상담하면서 하는 말이 상담 중 처음에는 말 속에 시니컬함을 느꼈다고 하더군요.
이제는 그런 면 많이 고쳤다고 생각했는데 여전히 그런 면이 묻어나는 모양입니다.
제가 말을 할 때 분석적으로 이야기하는데다 말을 끝내면서 별 의미가 있는 것은 아니다라는 식으로
말하는 것이 그런 식으로 느껴지는 것 같네요.
select99님의 말씀을 보면 도전적인 면을 내포하고 있는 것으로 보여 이곳의 다른 사람들에게 오해를 사고 있지 않나 싶습니다.
(그 도전성이 듣는이를 향하고 있다라는 느낌을 받을 수 있거든요.)
도전적인 대화를 즐기는 친구가 있으시다면 제가 부럽겠네요.
저는 도전적으로 제 말을 받아주는 친구는 있어도 같이 시니컬하게 이야기해주는 친구는 없거든요... ^_^
비용은 증가할지
비용은 증가할지 몰라도
여행을 빨리 계획할수 있고 (생산성)
혼자 삽질하는것보다 더 효율적일수도 있습니다. (윗글에서 설명해놓았듯이.)
Dynamic Opt. 에 대한 부정적인 견해는 (특히나 SW Side에서)
Dynamic Opt. 에 대해 잘 모르시기 때문이 아닌가 합니다.
가볍게 Patterson & Hennessey 의 Computer Architecture 책 (HW & SW I/F or Quantitative Approach) 을 권해드립니다.
그리고 실제 Performance는 Practical 한 Program의 실행속도를 측정해봐야 진정한 의미가 있습니다.
HW쪽 얘기를 하자면, 동작속도가 높다고, MIPS가 높다고해서
사용자 입장에서 성능 향상을 확실히 체감할수 있나요? (이것역시 위에서 권한 책의 앞쪽을 보시기 바랍니다)
이런 이유로 인해서 SPEC과 같은 BMT set이 나온거고 그런겁니다..
..편견은 무지에서 나온다라는 말이 있죠..
글쎄요 전님한테
글쎄요 전님한테 더많은 책을 권해드릴수 있습니다.
하지만 그러진 않겠습니다. 이유는 아시겠죠..
토론중 책을권하시기보다는 구체적인 사례를 보고싶군요.
보통 책에 나오는내용이라면 무비판적으로 받아들이고 절대적인것인양 믿어버리는 경향때문에
잘못된정보들이 많이존재하는게 아닌가합니다.
처음부분은
일단 비용은 증가한다는는건 수긍하신건지..몰라도.. 성능에서 생산성으로 방향이 바뀌었군요..
"여행을 빨리 계획할수 있고 (생산성)" 빨리계획 =>(빨리프로그래밍) 이란의미겠죠?
여기예에서 보듯이 빨리프로그래밍 될소지는 그다지 없습니다.
복잡한구현에서 많은lib 를주장하실지 모르겠지만 그점은 역시 C/C++ 도 마찬가지 입니다.
글을 잘 이해하시기 바랍니다.
글을 잘 이해하시기 바랍니다.
생산성을 포함한 성능입니다.
님이 주장하시는 요지인
Dynamic Opt에 대한 비판적인 내용과
Java의 생산성이 그리 높지 않다는 내용과 (C/C++과 비교하여)
GC의 효용성이 쓸모없다는 내용에 대해서
저한테 권해주실수 있는 책이 많이 있다고 하셨는데
위의 사항들에 대해서
구체적으로 적어주시면 감사하겠습니다.
역시 Computer Architecture 읽어야 하나?
예전 Bjarne Stroustrup의 interview 글 중에 최근
그 책을 다시 읽고 있다는 말을 읽은 적이 있는데... ^_^
그럼에도 불구하고..
Profile-Guidelined Optimization 란 개념이 나왔죠. (VS2005 와 GCC4 에서 지원)
흠... 실행시간 최적화는 아닌 것 같습니다만...
Profile을 사용한다는 것은 실행사례를 점검해서 최적화한다는 것이군요.
상당히 재미있네요.
Profile을 위한 test 사례 및 scenario 제작에 신경을 많이 써야 될 것 같네요. ^_^
GCC 4.1에 들어갔더군요.
여러가지
여러가지 말씀하셨는데..
일단 자바가 C보다 어떤개발에 lib 안쓰고 기본적것만으로 더많은것을 할수 있다구요?
글러리가요..자바가 훨씬 제약이 큰것으로 압니다.
또, C가 왜? 덩치큰 lib를 그다지 포함하지 않는지아세요? 없어도 되기때문인점도 큽니다. 없어도 그리불편하지 않고.
직접구현해도 그다시 오래걸리지도 않고 최적화까지 할수있기때문이죠..
또한 그때그때 각분야 최적화된 lib를 사용하는것이 유리합니다.
채팅서버 개발하라고 하면 성능차가 10배날것이라구요?
이또한 완전히 잘못된 추측으로 보입니다.
도한 C는 오래되고 안정적인 많은 lib들이 존재합니다..
lib내부까지 최적화하기도 합니다.
자바가 멀티플렛폼을 지향하는언어이기때문에....성능이 게임이 안된다구요?
전반적으로 추측성 글을쓰셨는데..
말보다는 어떤 근거가 있어야되지 않을까요? 구체적인 테스트자료라든가 말이죠..
C가 덩치 큰
C가 덩치 큰 라이브러리를 포함하지 않는 이유는 간단합니다. 표준화가 힘들거나 할 이유가 없기 때문입니다. 매우 다양한 -- 심지어 main()도 없는 freestanding 환경도 있고 -- 환경에서 돌아가기 때문에 표준화할 수 있는 거리가 크지 않죠. 이런 부분은 물론 다른 형태로 표준화가 되곤 했습니다. (POSIX라거나...)
C 같은 레거시가 없는 최근 언어들은 (비단 파이썬이나 루비 같은 게 아니라 컴파일되는 걸 생각해도) 대부분 상당한 분량의 라이브러리를 갖고 있습니다. 굳이 다른 언어를 들 필요 없이, C++만 생각해도 차기 표준에는 boost에서 영향을 받아 상당한 분량의 표준 라이브러리가 추가될 예정이죠. "없어도 된다"라고 생각하신다면 왜 이들 언어가 이렇게 하는지를 설명해 주실 수 있습니까?
살아있는 언어라면
살아있는 언어라면 어느 쪽이든 만족할래요..ㅎㅎ
영어vs한국어 식의 대결처럼만 보여서 말이죠.
뭐 속도, 안정성 등 분야를 나누어 대결하는 것은 어떨까 싶기도 하고..
이런 대결은 같은 조건의 대결이 아니라 각각 최선의 조건을 만들어 대결해야 할 듯 싶네요.
마치 올림픽처럼 말이죠~^^
──────────────────────────────────
대충 속도에 대해서는 다들 동의하면서도 논쟁에 흥미를 얻지 못하는 것 같은데...
예전에 교수님이 하셨던 말이 기억나는군요.
Memory가 많아지면 programmer들은 memory를 많이 쓰는 경향이 생긴다... -_-.
요새 hardware가 워낙 좋아져서 Java의 속도에 대해서 특정분야를 제외하고는
별 불만은 없는 것 같습니다.
하지만 분명 언어에서 제공하는 편의와 안정성 측면에서 Java가 제공하는 것들이 있고,
그로 인하여 programming이 편해진 것은 분명한 것 같습니다.
우선 C/C++에 비해 memory를 생각하는 차원을 어느정도 잊고, object 추상화 관점에서
programming이 강제된다던가, Garbage Collection과
기본적인 예외던지기, 마지막으로 대형 programming이 되기 위한
module화를 언어 차원에서 편의를 제공한 점이 있는 것, multi platform. 뭐 이정도...
제가 아는 분은 Java의 OOP가 C++의 OOP보다 쉬워서 좋았다고 하는데 솔직히 저는 그말이
이해가 안되더군요. 제 생각에는 위의 기능을 말하는 듯.
그런데 위의 기능들만 생각하면 Java보다 좋고, Java보다 성능좋은 언어들이 많이 소개되는데도
잘 쓰이지 않는 것을 보면 확실히 시장선점은 중요한 것 같습니다.
아~ 완전 동감 ㅎ
메모리가 넉넉한 시스템에서의 개발이라면 그냥 편하게 마구 쓰는 경향이 있지만
메모리가 한정적이고 임베디드 형의 시스템이라면 프로그래머는 메모리 관리에
신경이 곤두 스죠 ㅎ
자바라고 별반 다를게 없습니다.
수천만~수억 단위의 데이터를 처리해야 하는 경우라면 자바 역시 메모리를 타이트하게 사용해야 합니다.
필요에 의해서 만들어진 언어라면
거기에 합당한 용도로 사용하던지 아니면 사용하고 싶은걸 사용하든지겠죠.
톱으로 나무를 다듬을 수 있다고 해서 대패 안쓰고 톱으로 나무 다듬지도 않고
대패로 나무를 깎아낸다고 해서 나무 자를 때 대패를 사용하는 것도 아니겠죠.
desktop ~ # java
desktop ~ # java Speed_K
Elapsed time:1.061
Elapsed time:1.171
Elapsed time:0.52
Elapsed time:0.603
Elapsed time:0.521
desktop ~ # ./c
sizeof int=4 long=4
Elapsed time:1.103234
Elapsed time:1.103489
Elapsed time:1.102552
Elapsed time:1.103313
Elapsed time:1.102537
이건 어떤 일일까요?
자바가 탄생한 배경과
C가 탄생한 배경은 다릅니다.
자바를 필요로 하는 곳에 있는 사람들이 C를 몰라서 자바로 일을 하는 것은 아닐 겁니다.
C로 일하는 사람들은 자바를 몰라서 C로 일하는 것은 아닐 겁니다.
(물론 모르는 사람들도 있겠죠. 각설하고)
필요할 때, 필요한 것을 잘 활용해서 좋은 결과를 낼 수 있다면,
자바나 C나 성능을 비교하는 것에 어떤 의미가 주어질 지 의문입니다.
마지막으로 제가 빌드하고 실행 시킨 환경을 첨부합니다.
시스템 환경:
Linux desktop 2.6.22-gentoo-r2 #1 SMP Sun Aug 12 20:36:03 KST 2007 i686 Intel(R) Core(TM)2 CPU 6600 @ 2.40GHz GenuineIntel GNU/Linux
C 컴파일러
gcc (GCC) 4.1.1 (Gentoo 4.1.1-r3)
JAVA 컴파일러
java version "1.6.0"
Java(TM) SE Runtime Environment (build 1.6.0-b105)
Java HotSpot(TM) Server VM (build 1.6.0-b105, mixed mode)
컴파일 옵션
아무 옵션 주지 않았음.
ps. C로 컴파일 할 때 왜 최적화 옵션을 별도로 주신 건가요?
http://nicesj.com
https://nicesj.com
https://blog.nicesj.com
왜 최적화 option을 주지 않으셨나요?
이건 성능 논쟁이니까 자신에게 최대한 유리한 형태를 취하고 싶은거겠죠...
이런 논쟁할 때 Visual C++를 쓰고 debug mode code를 쓰지는 않겠죠? ^_^
페이지