论文部分内容阅读
摘要:使用J2ME平台在嵌入式平台所能提供的有限的硬件上开发应用软件与游戏,这对J2ME开发者来说是一个挑战。通常来说,刚刚开发完成的软件,要运行在真机设备上常常会出现一些问题。所以开发完成的产品,必须通过对产品进行多方面的优化。通过算法与编码方式的优化可以提高程序的运行速度、减少内存的占用、提高程序的运行效率。
关键词:J2ME代码优化与紧缩;测试基准;垃圾回收器
中图分类号:TP311.52文献标识码:A文章编号:1007-9599 (2010) 13-0000-02
Study on Embody Platform Development
——Optimization and Contraction of J2ME Code
Zheng Hong
(Fuzhou University,Institute of Mathematics and Computer Science,Fuzhou350011,China)
Abstract:In embedded platform using J2ME,can offer the development and application of the hardware and game,is a challenge to the developer J2ME.Generally speaking,software,just to run in the real machine equipment will often appear some problems.Therefore,the product must be through the optimization of various products.Through the optimization algorithm and coding method can improve the operation procedure of speed,reducing the memory and improving efficiency.
Keywords:J2ME optimization and contraction;Test benchmark;Garbage collection
通常来说,刚刚开发完成的手机游戏或应用软件,要运行在真机设备上常常会出现一些问题,如:程序无法运行,占用大量内存,运行缓慢等等。所以开发完成的产品,必须通过对游戏产品进行多方面的优化。为了解决这些问题,首先本文先介绍优化准则,再介绍解决方案。
一、优化准则
任何的优化方案一般要满足以下规则:
(1)设计正确:整体结构和设计正确将对代码優化起到最大的促进:服务器和客户端之间的操作如何进行分割。
(2)最后优化。如果在开发过程中过早地进行优化将会产生很多复杂的代码,这会阻碍改良的设计。
(3)有必要的时候才进行优化。查出瓶颈的所在并且集中精力把他们排列出来,这需要使用探查和堆空间分析工具。
(4)不要过度优化。你越优化你的代码,那么它就会变得在特定的应用环境下高度地和谐。如果在特定环境之外运行,那么它们可能变得非常缓慢。
(一)内存测试基准
为了测试内存的使用情况,可以使用在java.lang.Runtime中所提供的两种方法:
public long freeMemory();
public long totalMemory();
第一种方法告诉程序当前有多少字节的剩余内存可以使用,第二种方法给出在当前运行环境中总共的内存大小。
(二)时间测试基准
除了可以检查内存的使用情况外,还应该关注应用程序的运行速度。可以使用java.lang.System类中的currentTimeMillis()函数获得应用程序的运行时间。
计算程序执行时间的代码如下:
long start=System.currentTimeMillis();
//要计时的运算代码放在这儿
long time=System.currentTimeMillis–start;
二、优化方案
根据上文的优化准则,优化方案主要着眼于程序的执行速度、内存占用与JAR包大小。要使用整个应用在时间和空间上达到和谐统一的整体优异性能,必定是在矛盾的两者间取一个平衡点。
(一)优化代码运行速度
嵌入式的应用程序一般要求即时的反映,以满足应用环境下的信息有效性,所以对程序的运行响应速度都有特定的要求。
1.使用容器。
CLDC提供了4种常用的容器:Vector,Stack(Vector的子类),Hashtable和Array.J2SE中的BitSet类提供了可以存储任意长度比特的模式,它在CLDC中没有被支持。在容器使用方面有一些问题需要说明。应该避免使用Hashtable和Vector的默认构造方法.Java没有说明默认的初始化容量,这可能比我们需要的大很多。Vector和Hashtable都提供了可以指定初始容量的构造方法,分别是Vector(int initalCapcity)和Hashtable(Int initalCapcity)。
2.使用数组代替对象。
通常数组比对象运行的更快,更可靠。如文献[1]中所述,在矢量和哈希表中,虽然矢量和哈希表即简单又方便,但使用它们会增加大量的系统开销。在使用矢量或哈希表的场合,如果需要提高效率,就可以使用数组来代替。如果使用RMS系统,可能程序中会使用ByteArrayInputStream类进行记录的处理,但使用ByteArrayInputStream类的代价很大。因此,应该直接使用字节数组来进行处理。
3.使用缓存I/O。
缓存可以加快对文件的随机访问,所以在频繁进行I/O操作的应用程序中具有重要的作用。虽然数据I/O流提供了读写一个字节的方法,但是应尽量避免从数据流中读写一个字节。因为单个字节的读写效率非常低,应尽量使用带有缓冲的流读写方法。在J2ME中没有提供这两个类,要想提高I/O效率,就应该自己设计符合要求的带有缓冲的I/O方式。
4.内存清理。
一个有效而又简单的使用内存的方式在程序中使用主动地清理内存。一旦不再使用内存就应立即释放,这样能提高应用程序的性能。在程序中如果有数组不再使用,就应该释放,方法是设置数组指向null,使数组能被垃圾收集器收集,也可以调用System.gc()方法来进行垃圾收集。当程序在设法从一个网络的输入流中读取数据时,发生一个意外,这时就会导致异常的出现。在这种情况下,程序的执行将会跳转到异常处理部分,但已经打开的输入流尚未关闭。这些打开的输入流会占用大量的内存,应该尽量避免这个问题。
(二)优化内存使用
嵌入式设备一般内存空间十分有限,对内存的优化与管理是程序优化的重点。
创建和重复使用对象:
应尽量避免在一个循环内部创建一个新的对象,因为每创建一个新对象时,内存将被重新分配,而内存分配将花费大量的时间。而且一般来说,在一个循环体内创建的对象,有可能在循环体结束时被释放。这就意味着,每一次循环体的执行将促使系统运行一次垃圾收集器,这将导致循环体的执行速度与垃圾收集器的运行速度差不多。
在一个循环体内创建对象,将会导致程序性能受到很大得的影响。由于要花很长的时间来新建一个对象,于是应该尽量重复利用对象。因此,最明智的做法是保存和更新旧对象的字段,而不是创建一个新对象。例如,不要在自己的paint()方法中新建一个Font对象。相反,应将其声明成实例对象,再初始化一次。在这以后,可在paint()里需要的时候随时进行更新。
三、结论
程序设计过程就是一个不断权衡和折衷的过程。需要考虑不同的情况,对于某些设计或者技巧做出全面的权衡和取舍。时间和空间是程序设计的永恒的主题,程序设计过程就是对时间和空间的权衡和取舍。程序设计过程中的优雅和效率也是程序设计中必须考虑到的,一味使用面向对象技术,各个类之间的耦合程序最小,这样就不可避免地造成类膨胀。究竟采用何种设计方法,都需要根据项目和具体的情况做出全面的衡量。
参考文献:
[1]"Mobile Code,Distributed Computing,adn Agents."J.Waldo,in IEEE Intelligent Systems.March/April,2001
[2]Software Engineering Concerns for Mobile Agent Systems.J.Cook,New Mexico State University,2001
关键词:J2ME代码优化与紧缩;测试基准;垃圾回收器
中图分类号:TP311.52文献标识码:A文章编号:1007-9599 (2010) 13-0000-02
Study on Embody Platform Development
——Optimization and Contraction of J2ME Code
Zheng Hong
(Fuzhou University,Institute of Mathematics and Computer Science,Fuzhou350011,China)
Abstract:In embedded platform using J2ME,can offer the development and application of the hardware and game,is a challenge to the developer J2ME.Generally speaking,software,just to run in the real machine equipment will often appear some problems.Therefore,the product must be through the optimization of various products.Through the optimization algorithm and coding method can improve the operation procedure of speed,reducing the memory and improving efficiency.
Keywords:J2ME optimization and contraction;Test benchmark;Garbage collection
通常来说,刚刚开发完成的手机游戏或应用软件,要运行在真机设备上常常会出现一些问题,如:程序无法运行,占用大量内存,运行缓慢等等。所以开发完成的产品,必须通过对游戏产品进行多方面的优化。为了解决这些问题,首先本文先介绍优化准则,再介绍解决方案。
一、优化准则
任何的优化方案一般要满足以下规则:
(1)设计正确:整体结构和设计正确将对代码優化起到最大的促进:服务器和客户端之间的操作如何进行分割。
(2)最后优化。如果在开发过程中过早地进行优化将会产生很多复杂的代码,这会阻碍改良的设计。
(3)有必要的时候才进行优化。查出瓶颈的所在并且集中精力把他们排列出来,这需要使用探查和堆空间分析工具。
(4)不要过度优化。你越优化你的代码,那么它就会变得在特定的应用环境下高度地和谐。如果在特定环境之外运行,那么它们可能变得非常缓慢。
(一)内存测试基准
为了测试内存的使用情况,可以使用在java.lang.Runtime中所提供的两种方法:
public long freeMemory();
public long totalMemory();
第一种方法告诉程序当前有多少字节的剩余内存可以使用,第二种方法给出在当前运行环境中总共的内存大小。
(二)时间测试基准
除了可以检查内存的使用情况外,还应该关注应用程序的运行速度。可以使用java.lang.System类中的currentTimeMillis()函数获得应用程序的运行时间。
计算程序执行时间的代码如下:
long start=System.currentTimeMillis();
//要计时的运算代码放在这儿
long time=System.currentTimeMillis–start;
二、优化方案
根据上文的优化准则,优化方案主要着眼于程序的执行速度、内存占用与JAR包大小。要使用整个应用在时间和空间上达到和谐统一的整体优异性能,必定是在矛盾的两者间取一个平衡点。
(一)优化代码运行速度
嵌入式的应用程序一般要求即时的反映,以满足应用环境下的信息有效性,所以对程序的运行响应速度都有特定的要求。
1.使用容器。
CLDC提供了4种常用的容器:Vector,Stack(Vector的子类),Hashtable和Array.J2SE中的BitSet类提供了可以存储任意长度比特的模式,它在CLDC中没有被支持。在容器使用方面有一些问题需要说明。应该避免使用Hashtable和Vector的默认构造方法.Java没有说明默认的初始化容量,这可能比我们需要的大很多。Vector和Hashtable都提供了可以指定初始容量的构造方法,分别是Vector(int initalCapcity)和Hashtable(Int initalCapcity)。
2.使用数组代替对象。
通常数组比对象运行的更快,更可靠。如文献[1]中所述,在矢量和哈希表中,虽然矢量和哈希表即简单又方便,但使用它们会增加大量的系统开销。在使用矢量或哈希表的场合,如果需要提高效率,就可以使用数组来代替。如果使用RMS系统,可能程序中会使用ByteArrayInputStream类进行记录的处理,但使用ByteArrayInputStream类的代价很大。因此,应该直接使用字节数组来进行处理。
3.使用缓存I/O。
缓存可以加快对文件的随机访问,所以在频繁进行I/O操作的应用程序中具有重要的作用。虽然数据I/O流提供了读写一个字节的方法,但是应尽量避免从数据流中读写一个字节。因为单个字节的读写效率非常低,应尽量使用带有缓冲的流读写方法。在J2ME中没有提供这两个类,要想提高I/O效率,就应该自己设计符合要求的带有缓冲的I/O方式。
4.内存清理。
一个有效而又简单的使用内存的方式在程序中使用主动地清理内存。一旦不再使用内存就应立即释放,这样能提高应用程序的性能。在程序中如果有数组不再使用,就应该释放,方法是设置数组指向null,使数组能被垃圾收集器收集,也可以调用System.gc()方法来进行垃圾收集。当程序在设法从一个网络的输入流中读取数据时,发生一个意外,这时就会导致异常的出现。在这种情况下,程序的执行将会跳转到异常处理部分,但已经打开的输入流尚未关闭。这些打开的输入流会占用大量的内存,应该尽量避免这个问题。
(二)优化内存使用
嵌入式设备一般内存空间十分有限,对内存的优化与管理是程序优化的重点。
创建和重复使用对象:
应尽量避免在一个循环内部创建一个新的对象,因为每创建一个新对象时,内存将被重新分配,而内存分配将花费大量的时间。而且一般来说,在一个循环体内创建的对象,有可能在循环体结束时被释放。这就意味着,每一次循环体的执行将促使系统运行一次垃圾收集器,这将导致循环体的执行速度与垃圾收集器的运行速度差不多。
在一个循环体内创建对象,将会导致程序性能受到很大得的影响。由于要花很长的时间来新建一个对象,于是应该尽量重复利用对象。因此,最明智的做法是保存和更新旧对象的字段,而不是创建一个新对象。例如,不要在自己的paint()方法中新建一个Font对象。相反,应将其声明成实例对象,再初始化一次。在这以后,可在paint()里需要的时候随时进行更新。
三、结论
程序设计过程就是一个不断权衡和折衷的过程。需要考虑不同的情况,对于某些设计或者技巧做出全面的权衡和取舍。时间和空间是程序设计的永恒的主题,程序设计过程就是对时间和空间的权衡和取舍。程序设计过程中的优雅和效率也是程序设计中必须考虑到的,一味使用面向对象技术,各个类之间的耦合程序最小,这样就不可避免地造成类膨胀。究竟采用何种设计方法,都需要根据项目和具体的情况做出全面的衡量。
参考文献:
[1]"Mobile Code,Distributed Computing,adn Agents."J.Waldo,in IEEE Intelligent Systems.March/April,2001
[2]Software Engineering Concerns for Mobile Agent Systems.J.Cook,New Mexico State University,2001