오픈소스 프로그래밍 언어 중에 줄리아(Julia)라는 과학 계산용 언어가 있는데 아직 초기 버전이고 인터프리터 언어임에도 불구하고 C 컴파일된 것과 필적하는 성능을 보여주고 있어서 요즘 주목을 받고 있다. (요새는 JIT컴파일링은 아예 기본이 된 느낌이다.) 튜토리얼 동영상을 잠깐 봤는데 첫 인상은 파이썬과 matlab을 합쳐놓은 듯한 문법을 가지고 있다. (과학 계산용 언어에서 matlab의 영향은 무시할 수 없나 보다.) 아래 그림은 줄리아 홈메이지에서 캡쳐한 것이다.



위 표에 기록된 숫자들은 C프로그램의 성능을 1로 보았을 때 해당 언언의 성능 수치들이다 (낮은 수록 더 높은 성능임) 다음과 같은 몇 가지를 확인해 볼 수 있다.


  • octave의 성능은 matlab에 훨씬 못 미친다. octave는 그냥 matlab문법 연습용으로나 사용하고 실제 프로젝트에서 사용은 신중히 고려해보야야 할 것 같다.

  • 그리고 자바가 성능이 의외로 높다는 점이다. 여기에서는 JDK7으로 테스트했는데 JDK8 이상으로 하면 더 올라갈 것 같다.


파이썬과 matlab을 알고 있다면 줄리아를 익히는데 시간이 많이 걸릴 것 같지 않다. 그런데 이 그림을 보고 새삼 느끼는 점은 ‘자바를 더 공부해야겠다’ 였다. 줄리아도 판올림을 하고 정식 버전이 가까이 되면 훨씬 더 발전할 것 같긴 하다..




'프로그래밍언어.Lib' 카테고리의 다른 글

스크래치로 AI를 구현할 수 있다고?  (0) 2020.06.10
Posted by 살레시오

댓글을 달아 주세요

 자바에는 기본형에 대응하는 wrapper 클래스가 있다. 예를 들면 int 는 Interger, double은 Double 이다. 제네릭 클래스에는 기본형을 사용할 수 없으므로 이 wrapper 클래스를 사용해야 한다.


 그런데 기본형과 wrapper클래스의 성능 차이가 궁금해서 다음과 같은 간단한 프로그래으로 시험해 보았다.


package wrappertest01;

public class WrapperTest01 {
   public static long iter = 1000000L;
   public static int id;
   public static double db, dSum;
   public static long le, ls;

   public static Double[] dArr;
   public static double[] darr;

   public static void main(String[] args) {
       dArr = new Double[100];
       for(int k=0;k<100;k++) dArr[k]=new Double(1.0);
       
       darr = new double[100];
       //for(int k=0;k<100;k++) dArr[k]=new Double(1.0);

       lst = new ArrayList<>();
       for(int k=0;k<100;k++) lst.add(new Double(1.0));

       doIt();
       doIt();
       doIt();
   }
   
   public static void doIt() {
       double dSum1 =0, dSum2=0;
       long id;
       for(int n=0;n<10;n++) {
           
           ls = System.nanoTime();
           for(int k=0;k<iter;k++)
               for(int x=0;x<100;x++) {
                   db=dArr[x];
                   dArr[x]=db;
               }
           le = System.nanoTime();
           dSum1 += (le-ls)/1e9;

           ls = System.nanoTime();
           for(int k=0;k<iter;k++)
               for(int x=0;x<100;x++) {
                   db=darr[x];
                   darr[x]=db;
               }
           le = System.nanoTime();
           dSum2 += (le-ls)/1e9;
        }
       System.out.println("Double Arr: "+dSum1/10+ "sec.");
       System.out.println("double arr: "+dSum2/10+ "sec.");
   }
}


단순히 배열을 만들어서 배열의 요소를 읽고 쓰는 동작만 1억x100 번을 10번 실행한 평균 시간을 구한 것이다. wrapper클래스가 오버헤드가 있으므로 당연히 다소 느릴거라는 예상 했다. 결과는 기본형의 배열이 훨씬 더 동작이 빠르다는 것이다.



수치상으로는 거의 40배 빠르다.  이 실험만으로 전반적인 성능 비교는 물론 안되겠지만 성능이 중요한 곳에서는 왠만하면 기본형을 사용해야하며  제네릭 클래스를 구현하는 경우와 같이 어쩔 수 없는 경우에만 wrapper 클래스를 사용해야 한다는 언급이 맞는 것 같다.




Posted by 살레시오

댓글을 달아 주세요