이전 포스트에서 C++의 double형 연산과 long long int 형 연산 속도를 측정한 적이 있는데 똑같은 일을 JAVA에서 수행하고 시간을 측정해 보았다. (JAVA는 long형이 64비트 정수형이고 c++의 long long int 형에 대응한다.)
package javaapplication5;public class JavaApplication5 {public static void main(String[] args) {long iter = 100000000; //1억번System.out.println("Start");long ls, le;double da=12.3, db=45.6;ls = System.nanoTime();for(long k=0;k<iter;k++) da *= db;le = System.nanoTime();double tm1 = (le-ls)/1e9;System.out.println("elapsed time 1 = "+tm1);long la=2, lb=2;ls = System.nanoTime();for(long k=0;k<iter;k++) la *= lb;le = System.nanoTime();double tm2 = (le-ls)/1e9;System.out.println("elapsed time 2 = "+tm2);System.out.println(tm1/tm2 + " times faster.");}} |
수행 결과는 의외였다.
JAVA로 실행한 결과가 훨씬 더 수행시간이 짧다. 당연히 JAVA가 수행시간이 더 걸릴 줄 알았는데 아니었다. 아래가 g++ 로 컴파일하여 수행시간 결과다. 똑 같은 일은 c++ 은 14.591초, 자바는 0.357초 걸렸다.
윈도에서는 g++ 성능이 낮고 최적화를 전혀 하지 않았음을 감안하더라도 성능 차이가 이렇게 날 줄 몰랐다. 자바도 중간어를 JIT 컴파일해서 실행하므로 c++과의 실행 속도 차이가 그다지 크지 않다고 알고는 있었는데 직접 해보니 사실이었다. 한 가지 자바에서는 정수형과 실수형의 연산 속도 차이가 c++에서만큼 크지 않다는 것도 알 수 있었다.
그렇다면 c++을 고집할 필요가 없는 것 아닌가 싶다. JAVA를 이용하는 것이 훨씬 더 편하고 쉽다. 더군다나 CUDA4J 같은 GPU를 사용할 수 있는 라이브러리도 있으니 성능 향상이 필요할 때는 이것을 사용하면 되지 않을까.
실수 연산과 정수 연산의 시간 차이를 알아보기 위해서 자바로 실험을 조금 더 해 보았다.
package javaapplication5;import static java.lang.Math.exp;public class JavaApplication5 {public static void main(String[] args) {long iter = 100000000;System.out.println("Start");long ls, le;double da=12.3, db=45.6, dc=0, dd=0;ls = System.nanoTime();for(long k=0;k<iter;k++) {dd = da*db;dc = exp(dd);da += 1e-8;}le = System.nanoTime();//System.out.println(da + ", " + dc);double tm1 = (le-ls)/1e9;System.out.println("elapsed time 1 = "+tm1);long la=2, lb=2, lc = 0, ld=0;long[] larr = new long[2000];ls = System.nanoTime();for(long k=0;k<iter;k++) {long ll = k%2000;ld = la*lb;lc = larr[(int)ll];la++;}le = System.nanoTime();double tm2 = (le-ls)/1e9;System.out.println("elapsed time 2 = "+tm2);System.out.println(tm1/tm2 + " times faster.");}} |
이 연산에서는 30배 정도 속도에서 차이가 난다.
'연구' 카테고리의 다른 글
자바(JAVA)로 고정 소숫점 연산과 부동 소숫점 연산 속도 (0) | 2015.07.07 |
---|---|
자바의 기본형과 wrapper 클래스의 성능 비교 (0) | 2015.07.03 |
수학적인 신경망의 뉴런(neuron)에 대한 기술 (1) | 2015.07.03 |
자바에서 단순 배열과 리스트의 요소 접근 속도 비교 (0) | 2015.07.02 |
C/C++에서 double형 간 곱셈과 long long형 곱셈 수행 시간 비교 (0) | 2015.06.28 |