Swing 과 SWT 의 속도 차이에 대하여...

exsider의 이미지

제가 Swing 과 SWT 의 초기 로딩속도를 테스트하기 위해 다음과 같은 코드를 만들었습니다.

// Swing 버전
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
 
 
public class Test extends JFrame {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
 
 
 
        long start = System.currentTimeMillis() ;
        int row = 70 ;
        int col = 70 ;
 
 
 
        JFrame frame = new Test() ;
        frame.setSize(600 , 480) ;
        frame.setLocation(100, 100) ;
        frame.setTitle("Swing Demo") ;
 
        frame.addWindowListener(new WinListener(start)) ;
 
        Container c = frame.getContentPane() ;
 
        GridLayout gl = new GridLayout(row , col) ;
        c.setLayout(gl) ;
 
        for(int i = 0 ; i < row ; ++i) {
            for(int j = 0 ; j < col ; ++j) {
                String txt = "button " + i + " " + j ;
                JButton btn = new JButton( ) ;
                btn.setText(txt) ;
               // btn.addComponentListener(cl) ;
                c.add(btn) ;
 
            }
        }
 
 
 
        frame.setVisible(true) ;
 
 
 
 
    }
 
}
 
class WinListener implements WindowListener {
 
    private long start ;
 
    public WinListener(long start) {
        this.start = start ;
    }
 
 
    public void windowActivated(WindowEvent e) {
 
    }
 
    public void windowClosed(WindowEvent e) {
 
    }
 
    public void windowClosing(WindowEvent e) {
 
    }
 
    public void windowDeactivated(WindowEvent e) {
 
    }
 
    public void windowDeiconified(WindowEvent e) {
 
    }
 
    public void windowIconified(WindowEvent e) {
 
    }
 
    public void windowOpened(WindowEvent e) {
        System.out.println("time : " + (System.currentTimeMillis() - this.start));
 
    }
 
}

// SWT 버전
 
 
 
 
 
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.events.ShellListener;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
 
 
public class SWTTest {
 
 
    public static void main(String[] args) {
        int row = 70 ;
        int col = 70 ;
        long start = System.currentTimeMillis() ;
 
 
        Shell shell = new Shell() ;
        shell.addShellListener(new SListener(start)) ;
        shell.setText("Swt Demo") ;
        shell.setSize(600, 480) ;
        shell.setLocation(100, 100) ;
 
        GridLayout layout = new GridLayout(col , true) ;
        shell.setLayout(layout) ;
 
        for(int i = 0 ; i < row ; ++i) {
            for(int j = 0 ; j < col ; ++j) {
                String txt = "button " + i + " " + j ;
                Button btn = new Button(shell , SWT.PUSH) ;
                btn.setText(txt) ;
 
            }
        }
 
        Display display = shell.getDisplay() ;
        shell.open() ;
 
        shell.open();
        while (!shell.isDisposed()) {
          if (!display.readAndDispatch())
            display.sleep();
        }
        display.dispose();
 
 
 
 
    }
 
}
 
 
class SListener implements ShellListener {
 
    long start ;
 
    public SListener(long start) {
        this.start = start ;
    }
 
    public void shellActivated(ShellEvent arg0) {
        System.out.println("time : " + (System.currentTimeMillis() - start));
 
    }
 
    public void shellClosed(ShellEvent arg0) {
 
    }
 
    public void shellDeactivated(ShellEvent arg0) {
 
    }
 
    public void shellDeiconified(ShellEvent arg0) {
 
    }
 
    public void shellIconified(ShellEvent arg0) {
 
    }
 
}

양쪽 모두 동일하게 창을 하나 띄운다음 버튼 4900 개를 넣습니다.
저는 SWT 가 더 빠르다고 철석같이 믿었는데 위 코드를 실행해보면
Swing 버전은 2000 정도, SWT 버전은 4000 정도의 결과값이 나옵니다.
제가 측정한 방법이 잘못된 걸까요 ???

pool007의 이미지

잘 아시겠지만, 최근 JAVA JDK 의 버젼업시 가장 강조되는 기능향상 내용에
스윙이 항상 들어갑니다.

데스크탑에서의 실패를 만회해보고자 노력이 많이 들어가고 있죠..

--
Passion is like genius; a miracle.

--
Passion is like genius; a miracle.

meteors의 이미지

SWT는 윈도우즈 자체의 UI를 이용하는 데 비스타 전의 UI는 2D로 된 것입니다.

2D 하드웨어 가속 기술은 5~6년 전 부터 거의 개선이 없다시피 하지만 3D 하드웨어 가속 기술은 계속 발전하고 있습니다.
반면에 Swing은 Java2D에 기반을 두고 있고 Java2D는 3D 그래픽 하드웨어 가속을 점점 더 많이 이용하는 방향으로 나가고 있습니다.

그래서 윈도우즈 비스타를 쓰지 않는 이상 좋은 그래픽 카드를 쓸수록, 최신 버전의 JRE를 쓸수록 점점 더 차이가 벌어질 겁니다. 비스타는 UI를 3D로 만드니까 비슷하거나 더 빠를 수도 있겠죠.

atie의 이미지

Swing의 Vista UI는 Java6 90 이상의 베타 버전에서도 계속 고쳐지고 있는 부분입니다. 그리고, Java 프로그램의 UI에 OpenGL 등의 하드웨어 가속 기능을 요하는 코드가 들어가지 않는 이상 위의 테스트 코드 속도 비교에 비스타/3D UI를 갖다 붙이기는 무리입니다.
----
I paint objects as I think them, not as I see them.
Ubuntu Dapper user / Ubuntu KoreanTeam

----
I paint objects as I think them, not as I see them.
atie's minipage

meteors의 이미지

하드웨어 가속을 이용한 Java 1.4에 Java2D가 개선된 내용
http://java.sun.com/j2se/1.5.0/docs/guide/2d/14_features.html#VI

Java 5에 OpenGL로 가속하는 기능을 Java2D에 붙였다는 내용(옵션을 켜야 작동)
http://java.sun.com/j2se/1.5.0/docs/guide/2d/new_features.html#ogl

정확히 위의 코드가 어떤 환경에서 실행했는지 모르기 때문에 앞으로의 발전 방향을 추측한 겁니다.

atie의 이미지

http://www.eclipse.org/articles/Article-SWT-OpenGL/opengl.html
양쪽다 변하고 있습니다. ^^ 요즘 제가 jogl을 Java6 베타 버전에서 훝어보는 중이라 위의 링크 내용은 알고 있습니다.
----
I paint objects as I think them, not as I see them.
Ubuntu Dapper user / Ubuntu KoreanTeam

----
I paint objects as I think them, not as I see them.
atie's minipage

meteors의 이미지

둘 다 변하기는 하지만 변하는 방향이 일치하지는 않는 것 같습니다.

달아주신 링크 기사의 Introduction에 보면

Eclipse ships with the Standard Widget Toolkit (SWT) which provides access to native widget functionality through a platform-independent API. While the toolkit provides a rich selection of widgets, graphics support was somewhat limited. The SWT Graphics [1] package provided basic functionality needed to do 2D drawings, from rendering 2D primitives such as lines, arcs, rectangles and ovals, through clipping, text drawing and image display.

위 글에 따르면 그림을 그릴 수 있는 SWT widget(canvas 등)에 OpenGL을 사용할 수 있는 기능을 새로 추가한 것입니다.
SWT는 일부 widget만 3D를 지원하도록 하지만 Swing은 Java2D를 이용하여 컴포넌트를 그리기 때문에 Java2D가 하드웨어 가속으로 빨라지면 Swing의 전체 컴포넌트들도 덩달아 빨리 그려집니다.
또 Java2D는 2D를 그리는 거라서 OpenGL을 이용해서 3D를 2D 처럼 보이도록 흉내내는 것일뿐 SWT에서 3D를 그리는 것과는 차이가 있습니다.

SWT에서 Swing과 같은 결과를 내려면 위 문장에 있는 native widget functionality를 포기해야만 가능합니다.
위의 기사와의 대응은 JOGL이나 Java3D와의 비교에 어울립니다.

atie의 이미지

위의 처음과 마지막 부분에 지적하신 점은 맞습니다. 그런데 Swing의 Java2D가 빨라지는 혜택은 SWT도 같이 가지게 됩니다.
http://www-128.ibm.com/developerworks/java/library/j-2dswt/
이 글을 보시면 AWT 이미지를 SWT에서 사용하는 예를 보실 수 있습니다. 또한 현재의 데스크탑 그래픽 환경은 픽셀을 그리는 것에서 벡터 쪽으로 움직이고 있습니다. 이 경우에 cairo나 애플 core graphics의 네이티브 렌더링이 빨라지는 것에 SWT도 그대로 장점을 취하게 됩니다.
----
I paint objects as I think them, not as I see them.
Ubuntu Dapper user / Ubuntu KoreanTeam

----
I paint objects as I think them, not as I see them.
atie's minipage

atie의 이미지

SWT 버전의 코드가 실제 화면에 버튼을 4900개 그리나요? 언뜻 보기에도 shell.open()이 두 번 사용이 되고 Display의 위치, Swing 버전과 비교해서 Listener의 시작 시점(별 차이가 없겠지만) 등이 다른데요.

두 테스트 코드가 실제로 화면에 버튼 4900개를 동일한 시스템 L&F으로 버튼 텍스트와 함께 보여주는지 여부 후에 시간의 비교를 하는 것이 순서일 듯 합니다.
----
I paint objects as I think them, not as I see them.
Ubuntu Dapper user / Ubuntu KoreanTeam

----
I paint objects as I think them, not as I see them.
atie's minipage

exsider의 이미지

shell.open() 을 두번 호출하는 것은 제 실수입니다. 그 부분은 고쳤습니다.

그리고 측정하는 방식에 대해 간단히 설명드리면, Swing 이나 SWT 모두 메인윈도우가 처음 뜰 때 특정 이벤트가 발생하게 되어있습니다.
저는 그 이벤트를 받는 리스너를 등록하여 시간을 측정하는 방식으로 했습니다.

말씀하신데로 위코드를 그냥실행시키면 둘사이에 구조가 다르게 보입니다.
Swing 은 창안에 작은 버튼 4900 개가 모두 나오고 SWT 는 창안에는 버튼이 일부만 표시됩니다.

코드를 수정해서 둘의 외양이 어느정도 비슷해지게 만들어봤는데,
결과는 크게 차이가 없습니다.

dormael의 이미지

제 생각에 컴포넌트 생성의 속도라면 SWT가 느릴수도 있다고 봅니다.
하드웨어 가속이나 갱신(반응?)속도는 논외로 했을때 이야기 입니다.

Frame이나 Shell이 Activated되거나 Opened된 시점과 모든 그리기 갱신이 완료된 시점은 다를 가능성도 있습니다.
그리고 올려주신 소스를 실행해 보아도 결과가 다르게 보이므로 실제 컴포넌트 들의 그리기 속도가 차이가 있을 수 있습니다.
물론 실제 정밀한 테스트를 해본적이 없는 저의 생각일 뿐입니다.
하지만 결과가 다른 상황이므로 정확한 테스트라고 보기에는 힘들듯 합니다.

하지만 컴포넌트 생성 속도에 대해서만 이야기 한다면 SWT도 AWT와 같이 컴포넌트 마다 네이티브 피어를 필요로 하기 때문에 SWT가 느릴수도 있다고 봅니다.
제가 알기론 그런데 아닐수도 있습니다. ^^

실제로 버튼생성 루프 직전과 직후에 시간을 재어봐도 SWT가 Swing에 비해서 많이 느리게 나왔습니다.

그리고 제 생각에 Swing과 SWT는 이전의 AWT와 Swing과 같이 비교하기 힘든 대상이 아닌가 생각합니다.
SWT는 AWT와 같이 OS수준의 기본 컴포넌트 위주의 개발에 적합할 듯 하고 Swing은 Look & Feel, JTable로 대표되는 속도보다는 확장에 더 적합한 스타일이 아닌가 생각합니다.
물론 시간이 흐르면서 서로의 장점을 흡수하려는 경향도 있겠지요.

제 경험이 주로 AWT에서 나온 것이고 SWT, Swing 으로는 아직 개발해 본 경험이 없으므로 제대로 SWT를 파악하고 있는것은 아닙니다. 그냥 여기저기서 얻은 정보로 '이렇지 않을까?'라는 가정에서 나온 생각입니다.

결론을 이야기 하자면 SWT와 Swing을 선택할때의 기준이 '속도'이기 보다는 개발하려는 GUI의 '요구사항'에 맞추어져야 하지 않을까 생각합니다.

-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.

manea의 이미지

Swing은 저의 경험에 비추어 볼때 버추얼 머신이 모든 작업을 처리합니다. 윈도우에서 제공되는 사용자 이벤트야 운영체제 마다 다르겠지만, 화면에 그리는 부분은 JVM이 모든일을 처리합니다.
하지만 SWT는 JVM이 특정 윈도API를 활용하고 특정 JAVA GUI 부분도 활용하는것으로 추측되는데(개발해보지 않았고 사용만 해봤습니다. ^^;) 이렇게 되면
화면에 얼마나 많은 버튼을 얼마나 빨리 그리는지는 비교대상이 되기가 좀 어려울것 같네요. Swing은 초기 동작속도가 엄청 느리죠, SWT는 초기동작 속도가 엄청 빠릅니다. 초기동작속도를 제외한 실제 돌아가는 부분만 비교해야 맞을 듯 하네요.
단순히 버튼 생성시간 비교 대한 문제는 서로 좀 차이가 있을 것 같네요. 어쩌면 오프로드에서의 SUV와 스포츠카의 비교라고 볼 수 있을것 같네요.
두개의 단순 비교보다는 부문별 비교 목록을 작성한후에 비교하는것이 더 좋을거 같습니다. 예를 들면 오프로드 성능, 직진도로 속도, 순간 가속도, 포장도로와 비포장 도로의 운행여부등을 비교한후에 이건 SUV같다 저건 스포츠카로 부를만하다 라고 정하는게 더 좋을것 같아요. ^^

열정!! ^^

열정!! ^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.