- 浏览: 131430 次
- 性别:
- 来自: 上海
-
最新评论
-
一叶之源:
总结一下eclipse中的Job机制 -
xinxinlong:
lAnchor.getDy1() 是什么意思
操作excel--稍后整理 -
defrag_sly:
3.7是好用的,只是再mac下面不支持,mac不支持的效果还有 ...
swt下如何做出一个反向展开效果的tree -
defrag_sly:
eclipse3.7不好用了。谁知道给补充一下。
swt下如何做出一个反向展开效果的tree -
hamlzf:
好文!mark!
基于 OSGi 的面向服务的组件编程
相信不需要多说,大家都明白调用本地资源例如(icon)这类的资源是需要消耗很多性能的。SWT提供了Image这个对象,如果大家看看Image这个类,就会发现,对与图片的颜色,大小,色调等等所有的图形信息,封装到了ImageData(其实ImageData里还有个PaletteData,这个对象占用了很多资源)里面。也就是说每创建一次image就需要重新构筑一次ImageData。所以对于同一图片如果只创建一次,就会对效率有很大的提高。相信这是所有人都希望做的的事。
所以SWT对image提供了ImageDescriptor进行描述或者说代理,imageRegistry进行管理。在我们的实际开发中发现许多人使用方式不同,就会产生效率上的差异。
以下我对几种不同的使用方式进行了测试,有些错误方式甚至在eclipse源代码中都有使用。
测试的结果:
从结果可以发现,使用createByRegistry这个方法是极大的提高了效率,原因是:ImageRegistry内维护了一个key-->descriptor&image的一个map。将image缓存了起来。
相信绝大部分人不会用createByImageData这个方法,但是大家可能发现为什么这个方法比createByDescriptor还要快呢?这是由于Descriptor.create其实和new Image()是一样的,并没有把image缓存。相反createByDescriptor这个方法错误的使用了Descriptor浪费了时间。最后一个方法createByRegistryWrong是我发现大多数人最容易错的使用方法,只是简单的将Descriptor缓存起来但是在得到image时仍然与createByImageData没有差别,这也浪费了一些时间,size的增加createByImageData与createByRegistryWrong会越来越接近,但是与createByDescriptor会越来越大。
方法createByRegistry无疑是效率最优的方法。
ps:在我的机器上size=10000时候,甚至出现了没有足够handls的情况。(双盒1g的哦)
虽然以上的测试仅仅是一些极限的测试,对于同一图片使用1000次的情况,在eclipse中或许并不常见,所以才会出现eclipse的源代码中存在错误的使用方法吧。
不过效率的差别的确真的很明显。
总结一下,使用中Image类对于我们来讲是禁止使用的,如果需要image的一些信息,需要从Descriptor对象中获得,控制ImageData对象的后加载,需要image对象的时候利用Registry。
最好的方式是将Descriptor放到Registry中,使用Registry同一管理。
所以SWT对image提供了ImageDescriptor进行描述或者说代理,imageRegistry进行管理。在我们的实际开发中发现许多人使用方式不同,就会产生效率上的差异。
以下我对几种不同的使用方式进行了测试,有些错误方式甚至在eclipse源代码中都有使用。
import java.io.File; import java.net.MalformedURLException; import java.net.URL; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.widgets.Display; public class ImageTester { private static int size; private static final String imagePath = "F:/slyworkspace/myTest/gefTree/aaaaaaaa/icons/Control_Treeview.jpg"; /** * @param args */ public static void main(String[] args) { size = 1000; ImageTester imageTester = new ImageTester(); System.out.println("===========createByDescriptor============="); long start = System.currentTimeMillis(); System.out.println("start : " + start); for (int i = 0; i < size; i++) imageTester.createByDescriptor(); long end = System.currentTimeMillis(); System.out.println("end : " + end); System.out.println("time : " + (end - start)); // ================================================= System.out.println("===========createByImageData============="); start = System.currentTimeMillis(); System.out.println("start : " + start); for (int i = 0; i < size; i++) imageTester.createByImageData(); end = System.currentTimeMillis(); System.out.println("end : " + end); System.out.println("time : " + (end - start)); // ================================================= System.out.println("===========createByRegistry============="); start = System.currentTimeMillis(); System.out.println("start : " + start); for (int i = 0; i < size; i++) imageTester.createByRegistry(); end = System.currentTimeMillis(); System.out.println("end : " + end); System.out.println("time : " + (end - start)); // ================================================= System.out.println("===========createByRegistryWrong============="); start = System.currentTimeMillis(); System.out.println("start : " + start); for (int i = 0; i < size; i++) imageTester.createByRegistryWrong(); end = System.currentTimeMillis(); System.out.println("end : " + end); System.out.println("time : " + (end - start)); } public Image createByDescriptor() { URL fullPathString = null; try { fullPathString = new File(imagePath).toURL(); } catch (MalformedURLException e) { return null; } ImageDescriptor desc = ImageDescriptor.createFromURL(fullPathString); Image createImage = desc.createImage(); return createImage; } public Image createByImageData() { Image image = new Image(Display.getCurrent(), new ImageData(imagePath)); return image; } public Image createByRegistry() { ImageRegistry imageRegistry = JFaceResources.getImageRegistry(); String key = "ImageTestter"; Image image = imageRegistry.get(key); if (image == null) { URL fullPathString = null; try { fullPathString = new File(imagePath).toURL(); } catch (MalformedURLException e) { return null; } ImageDescriptor imageDescriptor = ImageDescriptor .createFromURL(fullPathString); if (imageDescriptor != null) { imageRegistry.put(key, imageDescriptor); image = imageRegistry.get(key); } } return image; } public Image createByRegistryWrong() { ImageRegistry imageRegistry = JFaceResources.getImageRegistry(); String key = "ImageTestter"; ImageDescriptor descriptor = imageRegistry.getDescriptor(key); if (descriptor == null) { URL fullPathString = null; try { fullPathString = new File(imagePath).toURL(); } catch (MalformedURLException e) { return null; } ImageDescriptor imageDescriptor = ImageDescriptor .createFromURL(fullPathString); if (imageDescriptor != null) { imageRegistry.put(key, imageDescriptor); } } descriptor = imageRegistry.getDescriptor(key); Image createImage = descriptor.createImage(); return createImage; } }
测试的结果:
===========createByDescriptor============= start : 1235712247921 end : 1235712254859 time : 6938 ===========createByImageData============= start : 1235712254859 end : 1235712261187 time : 6328 ===========createByRegistry============= start : 1235712261187 end : 1235712261468 time : 281 ===========createByRegistryWrong============= start : 1235712261468 end : 1235712267937 time : 6469
从结果可以发现,使用createByRegistry这个方法是极大的提高了效率,原因是:ImageRegistry内维护了一个key-->descriptor&image的一个map。将image缓存了起来。
相信绝大部分人不会用createByImageData这个方法,但是大家可能发现为什么这个方法比createByDescriptor还要快呢?这是由于Descriptor.create其实和new Image()是一样的,并没有把image缓存。相反createByDescriptor这个方法错误的使用了Descriptor浪费了时间。最后一个方法createByRegistryWrong是我发现大多数人最容易错的使用方法,只是简单的将Descriptor缓存起来但是在得到image时仍然与createByImageData没有差别,这也浪费了一些时间,size的增加createByImageData与createByRegistryWrong会越来越接近,但是与createByDescriptor会越来越大。
方法createByRegistry无疑是效率最优的方法。
ps:在我的机器上size=10000时候,甚至出现了没有足够handls的情况。(双盒1g的哦)
虽然以上的测试仅仅是一些极限的测试,对于同一图片使用1000次的情况,在eclipse中或许并不常见,所以才会出现eclipse的源代码中存在错误的使用方法吧。
不过效率的差别的确真的很明显。
总结一下,使用中Image类对于我们来讲是禁止使用的,如果需要image的一些信息,需要从Descriptor对象中获得,控制ImageData对象的后加载,需要image对象的时候利用Registry。
最好的方式是将Descriptor放到Registry中,使用Registry同一管理。
发表评论
-
TableEditor 让我郁闷的
2011-12-21 17:25 1446TableItem item = table.getIte ... -
eclipse search
2011-08-09 13:04 1003http://www.ibm.com/developerwor ... -
eclipse 中关于字符串匹配的几个类
2009-12-17 12:07 1614在做检索功能时,必然会遇到字符串匹配的问题。eclipse与j ... -
eclipse Drag&Drop机制图解
2009-11-20 15:55 1167工作需要,debug了eclipse的drag&dro ... -
Drag & Drop eclipse Viewer to GMF Editor
2009-10-09 11:21 19671,添加Viewer的Drag support priva ... -
请问,eclipse e4 究竟是什么?愿能集思广益
2009-08-13 16:05 979请问,eclipse e4 究竟是什么?愿能集思广益 -
简单介绍eclipse中的重构
2009-08-13 11:28 2388Eclipse中提供了几个扩展点,方便扩展重构功能。 基本的重 ... -
swt下如何做出一个反向展开效果的tree
2009-08-10 10:59 1866如题,其实很简单,即在tree的构造方法里加入样式参数{SWT ... -
eclipse 开发中的快捷键
2009-05-19 12:15 964Alt+Shift+F1 eclipse 3.4下会打开一个p ... -
将gmfeditor结合到mutipage中
2009-05-04 16:26 1353http://www.eclipse.org/articles ... -
eclipse还有什么不能做???
2009-04-09 15:13 999http://www.vimeo.com/1195398?pg ... -
如何把propertiesView的tab功能移植到EditorPart中
2009-04-01 10:12 2896最近有个调查将上图tab propertiesView的外 ... -
Eclipse中TextEditor常用扩展整理
2009-03-11 14:11 5499总结一下TextEditor,eclips ... -
eclipse中对redo与undo的支持
2009-03-10 16:14 4602大家在使用eclipse时,一定对ctrl+z和ctrl+r使 ... -
总结一下eclipse中的Job机制
2009-03-06 17:38 11680总结一下eclipse中Job,Job可以说是eclipse中 ... -
以GefTree为例解释一下如何结合使用gef+emf(2)
2009-03-05 14:24 3028创建gef框架。 按照基本习惯定义gef各部分包名: G ... -
以GefTree为例解释一下如何结合使用gef+emf(1)
2009-03-05 14:20 1559以GefTree为例解释一下如何结合使用gef+emf。 (1 ... -
gef写的tree例子--模型修改为emf
2009-03-04 16:11 2188模型部分已经修改为emf模型。 使用emf模型最大的好处是: ... -
用gef写的一个tree例子(无移动)
2009-02-26 18:06 1474又整理一下代码,增加了删除。 移动决定不做了,都是坐标之类的算 ... -
用gef写的一个tree例子(无移动,删除)
2009-02-26 11:16 1079计划 1、删除,移动做上去 2、将模型层提供为扩展点,( ...
相关推荐
**添加到注册表**:调用`ImageRegistry.put()`方法将图像对象添加到注册表中。 3. **获取图像**:通过`ImageRegistry.get()`方法从注册表中获取图像对象。 4. **释放资源**:在不再需要时,调用`Image.dispose()`...
代码如下: 实现1: BasicEditor.java 代码如下:package swt_jface.demo5; import java.io.BufferedReader; import java.io.File; import java.io.... import org.eclipse.jface.resource.ImageRegistry; import
12.5.2 图像类(Image) 254 12.5.3 图像数据类(ImageData) 255 12.5.4 保存图像类(ImageLoader) 256 12.5.5 Eclipse的图标 256 12.6 SWT绘图 257 12.6.1 使用绘制对象的方法 257 12.6.2 绘制线条 ...
scratch少儿编程逻辑思维游戏源码-米克 demo.zip
scratch少儿编程逻辑思维游戏源码-萝卜男孩拯救世界.zip
scratch少儿编程逻辑思维游戏源码-酷忍者.zip
教育科技_微信小程序_二手交易平台_大学校园二手书与物品循环利用公益系统_风华读书人校园二手交易平台_基于C2C模式的校内闲置物品交易系统_支持多校区独立运营的二手书交易平台_包含
全新UI彩虹外链网盘系统源码前后端美化模板整站 模版文件.zip
maoxig_nonebot-plugin-ai-timetable_32152_1745865455265
少儿编程scratch项目源代码文件案例素材-足球顶尖高手.zip
少儿编程scratch项目源代码文件案例素材-作战基地.zip
少儿编程scratch项目源代码文件案例素材-云端之上 1-4名玩家.zip
scratch少儿编程逻辑思维游戏源码-魔幻之塔.zip
scratch少儿编程逻辑思维游戏源码-楼层酷跑.zip
scratch少儿编程逻辑思维游戏源码-圈.zip
少儿编程scratch项目源代码文件案例素材-纸片马里奥自定义战役.zip
少儿编程scratch项目源代码文件案例素材-自由下落.zip
少儿编程scratch项目源代码文件案例素材-阻击蜈蚣.zip
健康监测与疾病预防_脉搏波分析_六轴加速度传感器_生理参数融合_STC12硬件采集_Android数据处理_SpringBoot后端_MySQL数据库_MatlabPython实验