J2ME设备的实际性能
性能标准可以帮助开发者开发出更好的应用程序
摘要
设备的性能可以帮助开发者开发出能让用户有好的体验的应用.了解性能可以帮助开发者了解每种设备的优缺点以及为具体设备开发合适的应用.进行性能测试是从底层来评价设备的.这篇文章是描述的是关于现有一些的J2ME(Java 2 Platform,Micro Edition)设备在Java 无线应用核心性能测试结果的文章.测试中心根据设备在测试中的性能分成不同的几类:虚拟机(VM)性能, 线程切换(thread-switching), 图形(graphics), RMS (record management system), 网络通信性能(network communication), 以及XML解析(XML parsing).
第一部分:J2ME设备:真实性能
J2ME(Java 2 Platform,Micro Edition)设备早已在亚洲与欧洲推出,现在也开始在美国推出了.厂商早已经推出了成千上万具有J2ME功能的GSM手机和PDA,不久的将来J2ME平台将成为通信设备/消费类设备等基本的功能.java的跨平台特性将允许一个程序可以在不同设备上运行.
然而,随着java设备越来越多,由于处理器,虚拟机还有设备的内存的不同导致针对某个产品的应用也存在很大的差异.不同的商家可能会开发出各自的虚拟机.因此,设备性能是编写适合的程序的前提.在桌面平台活服务器环境下,广泛被接受的传统的指标有:CaffeineMark, Linpack, SPECmarks和Dhrystones,但却大多与J2ME设备的性能无直接联系的.J2ME设备属于嵌入式的轻量级的运算设备,而不具备传统桌面或服务器同样的性能.所以,我们必须先弄明白怎样来测试J2ME设备的性能.
J2ME设备强调的不是巨大的运算量和复杂程度,而是简单的用户业务.因为特别小的屏幕尺寸和很麻烦的输入系统,使得有一个良好的用户体验的用户界面和运算成为每一个J2ME应用极其重要的一个要求.
在这篇文章里,我们从用户的角度来测试J2ME设备的性能,而不是从特定设备的处理器或运行的操作系统出发的.测试关注的是通过启动某个特定的功能,看能否为用户带来良好的体验.
目标平台
因为当前市场上出现的内置J2ME平台的设备只有支持CLDC 1.0和MIDP 1.0,我们的测试是基于J2ME CLDC/MIDP1.0的.等将来支持更高的J2ME版本的设备出来之后我们再更新这个基准.
测试的设备
截止到2002年5月15日,市场上已经可以找到70多种支持J2ME的移动设备,而且数量还在很快的增长中.
在测试中我们用到下列设备,这里是根据设备的功能分类,而不是根据性能分类.
通用的java电话 :
Siemens SL45i/6688i
Siemens M50 (也就是3118)
智能电话:
Nokia 9210 Communicator
Nokia 7650
Motorola Accompli 008 (也就是A6288)
Motorola 388
PDA:
Palm m125
Handspring Treo 270 Communicator
iPAQ 3760
J2ME Wireless Toolkit (PC模拟器)
虽然J2ME Wireless Toolkit 1.04 有根据设备定制,异常跟踪,内存使用管理等功能,但为了更好的作比较,我们都不使用这些功能,而且是基于Microsoft Windows2000和Intel Pentium4 1.5-GHz的环境下来测试我们的基准应用程序的.
iPAQ3760支持PersonalJava(Jeode)和J2ME(IBM J9 VM).通过ME4SE技术,J2ME应用程序可以转换成PersonalJava应用程序然后在PersonalJava环境测试.在iPAQ3760上我们同时使用Jeode和IBM J9环境来测试我们的基准程序.
在Palm m125,我们用了两个不同的J2ME虚拟机:
1.Sun的MIDP for Palm OS 1.0,可以从Sun的网站下载
2.IBM的J9 VM for Palm,在IBM WebSphere Studio Device Developer 4.0(可以**下载)自带
这里我们列举了内置J2ME(MIDP1.0)的移动设备的最低硬件要求:
Java version: CLDC 1.0 + MIDP 1.0
Memory needed: 128 KB of nonvolatile memory for MIDP components, 8 KB of nonvolatile memory for application-created persistent data, 32 KB volatile memory for Java runtime
Screen size: 96 x 54 pixels
Display depth: 1 bit
Pixel shape: 1:1
Networking: Two-way, wireless, with limited bandwidth
Input: One or more of the following: one-handed keyboard, two-handed keyboard, toUCh screen
第二部分:测试步骤
测试步骤
因为不同的设备有不同的硬件配置、操作系统和Java实现平台,我们提供一个一般的标准和相关的应用程序来测试和比较各种各样的J2ME设备的性能。我们定义了基准的两个不同层次:核心层次和应用层次。
核心层次:
我们拿出一个具有普遍意义的主意:看看这些J2ME虚拟机在执行常见的通用指令的时候所消耗的时间,这些指令有:逻辑比较、循环、方法调用、比较API调用等,对于这些低层次的指令,这里我们只考虑它们的速度性能。这些核心层次的测试是与应用程序无关的。
应用层次:
我们有一个普遍性的想法:看看不同的J2ME设备在运行常见的应用接口的时候所消耗的时间,例如在显示屏上绘制一张图片、打开一个HTTP连接、在本地文件系统储存数据、解析XML文档等。因为有些会消耗更多的内存,所以在定制基准中我们会给出内存使用信息。然而,因为不同的J2ME设备在内存占用原理方面几乎没有什么不同的,所以在确定的基准程序中我们不再考虑内存问题。
我们只对通用的J2ME平台性能设定基准,而不对个别的应用程序的性能或对应用程序的瓶颈做优化而设定的基准。但应用程序开发者可以通过了解我们的基准测试来比较那些占用更多处理器时间和堆栈大小的程序。开发者可以通过这些基准来判断那些内嵌有J2ME平台的设备的性能。
很多公司为Java性能定义了一些基准程序策略(有些是**的,有些则不是),大部分是用来测试桌面和服务器端的运行环境的,有些还提供了功能强大的工具,例如支持线程管理。在我们的标准中,我们会沿用基准的通用程序,还会用到典型的测试域。
在核心层次的测试中,我们选用了J2SE基准程序的通用测试域,同时还会加上一些我们自己的。在每一个测试域中,我们执行一个带有一小段测试代码的循环语句,从结果中我们就可以获得其速度(循环次数/秒),我们建立了一个名为JKernelMark(version1。0,10kb)的应用程序来作为核心层次的基准程序。
在应用层次的测试中,我们先定义了一些测试域,在每个测试域里我们执行带有一段测试代码的方法,从结果中就可以得到速度(每执行一次的毫秒数)。我们根据不同的J2ME API制作了不同的基准程序,为J2ME标准API制作了JAppsMark(version1。0 14KB)程序,为第三方API,例如关于XMLParse的,我们用kXML制作了JXMLMark程序(version1。0 21KB)来测试XML解析。
基准程序的细节
每一个基准程序都会用一个MIDlet来执行,下面解释我们在测试中用到的每一个基准程序。
JKernelMark
JKernelMark测试的有:
过滤:这是一个在给定数学公式和条件的情况下可以得到精确的结果的算法.
循环:JKernelMark测试虚拟机对循环优化到什么程度.这是一个能输出精确的表达式循环的结果.基准程序将这个结果放到一个数组中,并颠倒了数组的排列顺序.
逻辑运算:JKernelMark可以测试VM对逻辑结果的运算速度.JKernelMark创建了很多Boolean类型的变量,并且在很多循环语句里对这些变量进行取反运算.
字符串:在这里,我们测试了VM对典型的字符串操作的运算速度.JKernelMark在一个循环结构里创建了一个StringBuffer变量,接着添加一个字符串到这个StringBuffer变量去,并且准确指明新字符串的位置.
方法:JKernelMark测试VM在处理方法调用的时候的速度.它是通过计算递归函数总共需要的时间的.
内存分配与垃圾回收:这里,JKernelMark测试内存分配的速度以及垃圾回收对性能的影响有多大.它连续地在内存里创建新的对象和字节数组(每个循环大约要在堆栈里创建20KB的对象)如果内存不够的话,系统会开始回收垃圾同时会明显的影响创建新对象的速度.
JKernelMark 得分标志:每秒循环的次数;得分越高说明性能越好.
JAppsMark
JappsMark测试的内容用:
网络通信:用Java手机通过HTTP连接到一个Web系统,并且从响应中读取200byte的信息,同时记录下总共所消耗的时间.测试的执行时间也包括了网络的延迟.如果测试失败,我们记录为测试失败.尽管一部手机内嵌了J2ME,但你还是需要一张能提供数据服务的GSM或GPRS的SIM卡.当然也有其它方法来配置J2ME设备来完成这种测试,这里不作介绍.例如你可以直接把手机与PC连接起来.
低层的图形用户界面(Low-level GUI):JAppsMark测试了Java手机在屏幕上绘图的性能.这个测试是通过加载一个图片文件并随机在一个250象素的canvas描绘出来,并记录不同的设备子完成这个程序所消耗的时间.
RMS (record management system):关于RMS测试,是用一个MIDP程序创建一个record store,增加一条记录,从新返回RecordStore对象,通过反复地记录,最终删除这个record store,并记录不同设备在完成这个过程所消耗的时间.
线程转换:JAppsMark测试VM在线程转换方面的速度.
JAppsMark的得分表明:每运行一次的毫秒数;这个数字越小,性能就越好.
JXMLMark
XML解析在J2ME里是很有趣的,J2ME还没有标准的XML相关的API.因为普通的XML解析相对于移动设备来说显得太笨重了,包括运行时性能、用户的感觉、代码的大小等性能参数在J2ME的XML解析里就显得十分重要了。
有三个方法可以解析XML:
1、原型解析读入整个文件,并且在内存里创建一个文件的映射。原型解析比其它类型的解析占用的内存多得多。
2、推动式解析虽然也是读入整个文件,但是它把文件分成很多部分,并且连接了一个对象监听器。这就是流行的SAX (Simple API for XML)解析的运作原理。
3、拉式解析每次只读取文件的一小部分,应用程序通过反复的请求让整个文件被解析。
尽管MIDP 1.0没有包括XML解析,由于XML的重要性,Sun打算在MIDP2.0里添加一个能够实现跨平台数据交换的微型且高效的XML解析器。
在轻量型的XML解析器中,kXML是最流行并且使用标准XML解析API,能在MIDP环境运行的XML解析器之一。
因此我们把kXML作为XML解析的基准速度的基本的API。我们使用的是kXML1.21,因为kXML 2.0还在alpha测试中(我们设计我们的程序的时候)。
因为内存有限,所以J2ME移动设备只能解析很小的XML文件。我们创建了一个简小的XML文件作为我们的基准,如下所示。DTD (document type definition)不是必要的,因为kXML不支持DTD。
<?xml version="1.0" encoding="UTF-8" ?>
<message_list>
<message>
<header>
<status>xxxStatus</status>
<command>xxxCommand</command>
<messageId>xxxMessageId</messageId>
<processingRule>xxXProcessingRule</processingRule>
</header>
<body>
<a>1</a>
<b bvalue="123" />
<c cvalue="1234">cvalue</c>
</body>
</message>
</message_list>
我们用一般的方式从头到尾来解析这个XML文件并读入每个标签、每个属性、每个值。需要更详细的信息可以参考Jonathan Knudsen的"Parsing XML in J2ME"。
我们计算解析这个文件所需的时间(毫秒),并把这个时间作为得分。
得分的意思:每解析整个文件所需的毫秒数;这个数字越小,表明性能越好。
(出处:http://www.knowsky.com)