说这句话,意思是Swing可以快过SWT,而且事实已经证明了这一点。前面文章已经说过,MiG Layout Site网站的Mikael Grev曾编写了一个GUI benchmark,来测试和比较Swing和SWT的性能,最终结论是除在Windows上Swing和SWT的速度几乎一样快之外,在其他操作系统上Swing的速度都要快于SWT。
这好像违背人们的常识,模拟的组件如何能快过本地组件?实际如果你按照下面的想法想,这个现象也就不难解释:
1. 本地组件实际上也是画出来,只不过是操作系统画罢了。这个通常是人们所忽略的,仿佛只有Swing是画出来的,而本地组件就是屏幕上的附属物似的,忘记了它们也是画出来的。
2. 现在Java平台的运行速度已经不慢于C/C++等静态编译型语言的产生的代码。人们往往提到本地仿佛就比Java实现要快。在过去也许可以这样看,但是现在随着Java 6平台性能的提高,许多地方Java平台的速度反而快过本地调用。因此是应该让人们从过去对于Java速度的印象中醒过来时候了,现在人们提到Java速度想到的应该是和C/C++相提并论了。
3. JNI调用耗费的时间是不能忽略的。JNI调用速度要比普通Java方法调用慢好几倍甚至几十倍。即便是在Java 6中,这种情况并没有改善。问题的实质在于Java运行时系统和本地库之间毕竟是两个异质系统,它们之间的调用必然有大量的转换开销。Java普通方法调用和JNI调用之间的关系就好像是本地调用和远程过程调用之间的区别,远程过程调用有网络数据通信和数据类型系统转换的开销,而JNI也有数据传递(主要是内存拷贝,速度虽然快过网络通信,但是相对直接调用是不能忽略的)和数据类型系统转换(Java数据类型和C语言数据类型)的开销。
4. Swing绝大部分是用Java平台模拟出的组件,这个过程都在一个系统平台内完成。而SWT是部分在本地系统完成,部分在Java平台完成,要在这两个平台之间需要进行频繁的数据交互。
5. Swing可以享受JVM的特殊待遇,进行特殊优化,比如inline,JIT代码,Swing事件队列对于事件的预处理(合并Paint事件,批处理Java 2D光栅指令等),这就像本地组件可以利用操作系统进行优化一样。
因此如果排除人的因素,也就是说排除Java平台的工程师、Windows的工程师、Linux的工程师和Solaris的工程师本身能力的区别,从理论上来说,Swing的速度是完全可以超过SWT的。理解这一点你只要记住最关键的两个原因是:
1. Java平台的速度可以和C/C++一样快。这个已经被很多benchmark证明了,它们的速度是相当的。因此Java模拟组件不一定会慢过本地组件,这要看谁的实现算法好。
2. 跨系统之间的调用(JNI调用)开销是不能忽略的。这个也在很多论文和benchmark得到证明。Swing中组件和数据之间的更新速度要远快于SWT,其原因就是Swing不需要进行数据传输,而SWT需要跨两个系统进行数据传输。这在大数据量编辑组件如Table中尤其明显。原因就在于Swing直接显示了数据模型,而SWT需要将这些数据使用JNI发送到本地组件中去。
不可否认,Microsoft在Windows上浸淫了这么多年,图形用户界面的优化已经非常完善,而反观Linux和Unix系列的桌面系统却没有如此优化过。这就是为什么前文的benchmark显示SWT能在Windows上和Swing速度相持平,而在其他平台上远慢于Swing的原因。因为SWT使用本地组件,它既占了Windows的光,也因此吃了Linux和Unix的亏。
分享到:
相关推荐
SWT的设计目标是提供一个比Java Swing更接近原生平台的GUI,因此它能够更好地实现与操作系统底层的交互,提供更好的性能和更一致的外观。 在标题提到的"swt源码和jar包dj-native-swing-swt.jar"中,"dj-native-...
swing2swt java应用开发包,貌似现在很少了
由于SWT更多地依赖于底层的本地GUI工具集,它的跨平台能力不如Swing,但是它的性能通常比Swing更佳。 在讨论三者的区别时,我们可以从它们的设计哲学、性能、兼容性、API设计等方面入手。Swing的设计目标是完全使用...
在Java编程环境中,SWING和SWT(Standard Widget Toolkit)是两种常见的图形用户界面(GUI)库,用于创建桌面应用程序。然而,有时我们可能需要在这些应用中集成Web浏览功能,比如显示网页或者运行Web应用。这篇博客...
Swing组件基于抽象窗口工具包(AWT),但增加了许多功能和改进,比如轻量级组件模型,使得Swing应用程序运行速度更快,占用资源更少。 1. **Swing组件**:例如在提供的代码中可能包括了JFrame(主窗口)、JButton...
Java Swing和 SWT 是两种在Java中创建图形用户界面(GUI)的库,它们都提供了丰富的组件和工具来构建桌面应用程序。在这篇文章中,我们将深入探讨Java Swing中的分页技术和SWT(Standard Widget Toolkit)的使用,...
Swing Designer SWT 是一款强大的图形化工具,专为在Java环境中设计Swing和SWT用户界面而设计。这款插件是Eclipse IDE的一个扩展,它允许开发者通过直观的拖放方式构建用户界面,大大简化了GUI(图形用户界面)开发...
在Java桌面应用开发领域,Swing和SWT(Standard Widget Toolkit)是两个常用的库,用于创建用户界面。本篇文章将深入探讨Eclipse中的Swing和SWT插件,特别是jigloo插件。 Swing是Java Foundation Classes (JFC)的一...
### Java Swing 迁移到 SWT 的相关知识点 #### 1. 关于本教程 - **教程简介**:本教程旨在帮助开发者了解如何将基于 Java Swing 的应用程序迁移到 SWT(Standard Widget Toolkit)。自2001年首次发布并捐赠给开源...
而SWT(标准窗口工具包)是由Eclipse基金会维护的一个开源库,它直接与操作系统交互,提供更快的性能和更接近原生的用户体验。Swt Builder插件允许开发者在Eclipse环境中直接拖放组件,可视化地设计UI,而无需编写...
在Java中,主要有三个库用于创建GUI:Abstract Window Toolkit (AWT)、Swing和Standard Widget Toolkit (SWT)。下面将详细阐述这三个库的特点、用途以及它们之间的差异。 ### AWT(Abstract Window Toolkit) AWT是...
Swing提供了比AWT更多的组件选择,包括JButton、JLabel、JTable等,还提供了布局管理器、国际化支持以及可定制的外观(LookAndFeel)。Swing组件可以拥有透明背景,支持非矩形形状,而且更容易进行自定义和扩展。 *...
swt swing awt的区别
### MyEclipse图形界面开发Swing_SWT #### 图形界面简介 - **概述** 图形用户界面(Graphical User Interface,简称GUI)是计算机科学中的一个重要组成部分,允许用户通过图形符号和视觉指示进行操作,而不是仅...
### Swing到SWT迁移教程概览 #### 一、关于本教程 本教程旨在帮助开发者了解如何将基于Swing的应用程序迁移到SWT(Standard Widget Toolkit)。自2001年Eclipse平台首次发布以来,它已经在工具提供商社区中获得了...
- **丰富的功能**:Swing组件的功能比AWT组件更为强大,包括表格(JTable)、树状视图(JTree)等。 #### 4. SWT详解 ##### 4.1 SWT概述 SWT是一个面向桌面应用的图形界面工具包,它利用本地操作系统提供的图形库来...
Swing组件通常比AWT组件更加美观,并且提供了更多的功能。 - **SWT (Standard Widget Toolkit)**:相比于AWT和Swing,SWT更加注重性能和本地外观。SWT使用本地控件,这意味着它可以更好地融入不同的操作系统环境中,...
《基于Java、Swing、Swt与SQLServer的超市会员管理系统》 在计算机科学领域,尤其是在软件工程中,课程设计是提升学生实践能力的重要环节。本项目“Java课程设计基于Java、Swing、Swt、SQLServer开发的超市会员管理...