AWT/SWING 성능 비교(기본 출력 기능) | ![]() |
JLab 편집실 jini (허원진)
그동안 많은 분들이 SWT/SWING 간의 성능차에 대해서 궁금해 했습니다. 이번에 제이렙에서 GUI 전반에 관한 테스트 기사를 분비했습니다.자바 어플리케이션의 경우 특성상 절대적 수치 측정이 불가능합니다. 필자는 표본공간의 원소 개수를 늘려서 표본 산출로 얻어지는 결과에 대해서 신뢰도를 높였습니다. 이번 테스트의 목적은 인터페이스 표현 성능을 비교하기 위해서 입니다. 콘트롤과는 무관함을 알립니다.
기본 그래픽 출력 비교
채워진 사각형과 텍스트 출력을 이용 SWING/SWT간의 기본 성능 테스트 해보았습니다. 코딩 방식의 차이로 테스트에 불공정이 없도록 신중히 코드를 선택했습니다. SWING/SWT 모두 GUI 제출력을 위한 메소드를 지원하나 테스트 중에 이 메소드의 요청을 모두 수용하지 않는다는 것을 알았습니다. 다시 말해서 100번 다시 그리기 요청을 한다고 100 다시 그리는 것이 아닙니다.
사용된 소스
SwingGraphicTest.java
import java.awt.Color; import java.awt.Graphics; import java.awt.HeadlessException; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent;
import javax.swing.JFrame;
/* * Copyright 2001 JLab wonjin.heo * 이 프로젝트는 JPL 라이센스를 적용합니다. * 자세한 내용은 www.jlab.net나 프로젝트 팩키지 안의 license.txt를 보십시요 */
/** * SwingGraphicTest <br> * * @author jini */ public class SwingGraphicTest extends JFrame { Color color = new Color(0, 0, 0); Color color2 = new Color(255, 255, 255); static boolean first = true; /** * @throws java.awt.HeadlessException */ public SwingGraphicTest() throws HeadlessException { super("Swing Test"); setSize(1024, 768); show();
}
public static void main(String[] args) { SwingGraphicTest main = new SwingGraphicTest();
main.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } });
}
public void paint(Graphics g) { long time = System.currentTimeMillis(); if(first)for (int i = 0; i < 12000; i++) { g.setColor(color); g.fillRect(0, 0, 1024, 768); g.setColor(color2); g.drawString("test", 10, 40); } first = false; System.out.print(System.currentTimeMillis() - time);
} } |
SWTGraphicsTest.java
import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell;
/* * Copyright 2001 JLab wonjin.heo * 이 프로젝트는 JPL 라이센스를 적용합니다. * 자세한 내용은 www.jlab.net나 프로젝트 팩키지 안의 license.txt를 보십시요 */ /** * SWTGraphicsTest.java 2003-02-20 * * @author wonjin */
public class SWTGraphicsTest { static boolean first = true; public static void main(String[] args) { final Display display = new Display(); final Color color = new Color(display, 0, 0, 0); final Color color2 = new Color(display, 255, 255, 255); Shell shell = new Shell(display); shell.setText("SWT Test");
/* Paint 리스너 등록 */ shell.addListener(SWT.Paint, new Listener() { public void handleEvent(Event e) { GC gc = e.gc; //그래픽 컨택스트 생성 long time = System.currentTimeMillis(); if(first)for (int i = 0; i < 12000; i++) { gc.setBackground(color); gc.fillRectangle(0, 0, 1024, 768); gc.setForeground(color2); gc.drawString("test", 0, 20); } System.out.print(System.currentTimeMillis() - time); first = false; } }); shell.setSize(1024, 768); shell.open();
while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } }
|
결과
결과는 테스트 소스를 10000번 테스트한 결과를 종합해서 평균을 산출했습니다. 따라서 테스트를 위해서 120000000(일억 2천만)개의 표본을 얻었습니다. 이 결과를 보면 SWT가 기본 출력에서 26%의 성능이 앞서갑니다.
SWING SWT 9547 7109 표1 기본 출력 테스트 결과
폰트 출력 비교
폰트를 이용한 출력의 경우 SWT, SWING간의 폰트 크기 기준의 문제로 크기가 다릅니다. SWING은 픽셀 크기, SWT는 네이티브 플랫폼에 정의된 크기(트루 폰트, 고정 폰트) 입니다. 차이로 인해서 비교의 공정을 위해서 서로 비슷한크기의 폰트로 출력했습니다.
사용된 소스
SwingFontTest.java
import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.HeadlessException; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent;
import javax.swing.JFrame;
/* * Copyright 2001 JLab wonjin.heo * 이 프로젝트는 JPL 라이센스를 적용합니다. * 자세한 내용은 www.jlab.net나 프로젝트 팩키지 안의 license.txt를 보십시요 */
/** * SwingFontTest <br> * * @author jini */ public class SwingFontTest extends JFrame { Color color = new Color(0, 0, 0); Color color2 = new Color(255, 255, 255); static boolean first = true; /** * @throws java.awt.HeadlessException */ public SwingFontTest() throws HeadlessException { super("Swing Test"); setSize(1024, 768); show();
}
public static void main(String[] args) { SwingFontTest main = new SwingFontTest();
main.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } });
}
public void paint(Graphics g) { long time = System.currentTimeMillis(); if (first) for (int i = 0; i < 12000; i++) { g.setFont(new Font("바탕", 0, 30)); g.drawString("바탕"+i, 10, 50);
g.setFont(new Font("굴림", 0, 30)); g.drawString("굴림"+i, 10, 80);
g.setFont(new Font("궁서", 0, 30)); g.drawString("궁서"+i, 10, 110); } first = false; System.out.println(System.currentTimeMillis() - time);
} }
|
SWTFontTest.java
import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell;
/* * Copyright 2001 JLab wonjin.heo * 이 프로젝트는 JPL 라이센스를 적용합니다. * 자세한 내용은 www.jlab.net나 프로젝트 팩키지 안의 license.txt를 보십시요 */ /** * SWTFontTest.java 2003-02-20 * * @author wonjin */
public class SWTFontTest { static boolean first = true; public static void main(String[] args) { final Display display = new Display(); final Color color = new Color(display, 0, 0, 0); final Color color2 = new Color(display, 255, 255, 255); Shell shell = new Shell(display); shell.setText("SWT Test");
/* Paint 리스너 등록 */ shell.addListener(SWT.Paint, new Listener() { public void handleEvent(Event e) { GC gc = e.gc; //그래픽 컨택스트 생성 long time = System.currentTimeMillis(); if (first) for (int i = 0; i < 12000; i++) { gc.setFont(new Font(e.display, "바탕", 20, SWT.NORMAL)); gc.drawText("바탕"+i, 10, 10,true);
gc.setFont(new Font(e.display, "굴림", 20, SWT.NORMAL)); gc.drawText("굴림"+i, 10, 40,true);
gc.setFont(new Font(e.display, "궁서", 20, SWT.NORMAL)); gc.drawText("궁서"+i, 10, 70,true); } System.out.println(System.currentTimeMillis() - time); first = false; } }); shell.setSize(1024, 768); shell.open();
while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } } |
결과
첫 번째 결과는 테스트 소스를 10000번 테스트한 결과를 종합해서 평균을 산출했습니다. 따라서 테스트를 위해서 120000000(일억 2천만)개의 표본을 얻었습니다. 두 번째 결과는 최초 출력 시에 걸린 시간입니다. SWING의 경우 최초 폰트 로딩 시간이 필요합니다. 하지만 SWT는 이와 같은 과정이 필요 없습니다. 로딩 시간을 제외 하고도 SWT가 성능이 앞서는 것을 알 수 있습니다.여러 폰트 사용시에 출력은 SWT가 28%의 성능이 앞섭니다.
SWING SWT 12547 9037 828 0 표2 폰트 출력 테스트 결과
다음 기사에서는 메모리 사용량과 컨트롤을 비교해 보겠습니다.
www.jlab.net
이 컨텐츠는 JPL에 의해서 보호 받습니다. 오탈 자나 건의는 이곳에 해주십시오
카페 > 자바사랑 [java/swin.. / 힌둥이님
http://cafe.naver.com/javalove/402
'My work space > Java' 카테고리의 다른 글
JDK1.4 Logging API의 사용을 통한 Logging (0) | 2008.08.20 |
---|---|
프로그래밍에유용한사이트 (0) | 2008.08.20 |
소켓(Socket) (0) | 2008.08.20 |
Swing으로 GUI만들기 (0) | 2008.08.20 |
AWT란 (0) | 2008.08.20 |