基于ARM的KVM移植优化MIDP程序
李振鹏
版权所有,转载请注明出处
最近研究ARM体系结构与编译器,并且有幸接触到了JVM在Nucleus上移植,因此对于特定应用优化有了更进一步的了解。下文将介绍一部分ARM优化技术,主要包括指令优化,缓存优化,驱动优化。 对J2ME程序编写者而言,优化主要包括速度、内存以及存储空间优化。下文将分别根据ARM处理优化技术介绍相应的优化方式。
一、指令优化
在ARM7以上ARM处理器的系列中,有一款编号是带有J的,表示支持Jazelle指令扩展,也就是说可以加速Java字节码的执行,这样就可以做出非常优化的JVM,大大加速J2ME程序。一般来说,带有这种扩展指令的ARM处理器将极大地加速MIDP程序的执行,因此速度优化基本上可以放到其余优化的后面,主要考虑内存以及空间优化。但是,Jazelle指令并不是公开的指令集,但是可以基本确定是8位的指令集。除非是ARM的核心合作伙伴或者是购买了授权,否则是无法使用的。很遗憾,我对这指令集非常感兴趣,但是无法接触到。因此也无法说明关于此指令集的优化。这就如同Sun开放了CLDC的JVM源码,但是没有开放Hotspot的CLDCJVM源码,因此对于大多数开发者而言,是没有多大用处的。
二、缓存(cache)优化
在ARM处理器系列中,一般把处理器cache作为可选的组建,如果不加cache,将会降低一部分成本,同时对于实时性有更好的控制,但是将极大地影响程序性能。但是大部分处理器是有cache的,这样如果程序流程控制的比较好,将会极大地增加程序的性能,而且不用付出代价,只不过在程序设计时注意使用cache,因此一部分操作可能变成异步的。但是这样的操作对于MIDP程序而言,影响不大,毕竟J2ME程序几乎不可能影响系统层面的操作。
这里提出的cahe优化,需要根据cache大小来作出判断。一般来说,8K以上的cache比较普遍。也就是说如果把频繁执行的程序语句保持在4K以下,将极大地赠加程序的性能。不会频繁的去读取内存,而是在从速度更快的cache中读取数据。
ARM处理器由两种架构,分为冯诺依曼和哈佛架构,一般来说ARM7是冯诺依曼架构,而ARM9以上的就成为哈佛架构,这两种架构对于应用层编程来说影响不大。
三、驱动优化
这里提到的驱动程序优化,主要来说对于MIDP程序影响最大的屏幕刷新操作,一般来说MIDP程序的刷新操作占据程序执行时间的大部分。
屏幕刷新操作从底层来看主要分两种,一种是直接的DMA数据传输,另一种是对屏幕指定位置直接操作。这两种操作从速度上来讲,第一种速度快,不用计算屏幕位置,只需要把指定数据传输到屏幕缓存即可,传输过程需要CPU干预;而第二种是对屏幕缓存直接进行操作,浪费CPU计算时间。因此需要尽量避免对屏幕指定位置进行绘制操作。
这两种技术对应到应用层就是DMA的技术,是把内存中的图片传输到显示缓存也就是通常的bitblt操作,而屏幕指定位置的操作就是如DrawRect或者是DrawString等操作,后面的操作将极大地影响屏幕的绘制速度,因此需要尽量避免。这里需要特别指出的是如果提供了clearfullscreen操作,就一定要使用,不要使用以指定颜色FillRect全屏操作来进行屏幕的清除动作。但是也不排除两种都没有进行优化,因此如果可能,最好使用图片来进行背景的清除。
总结
上文对于各种技术的优化只是简单的进行了描述,对于细节问题并没有点明,主要原因是目前我接触到的底层知识有限,并没有很好的理解。只是起到说明的作用,毕竟知道可能采取何种优化,才能够去寻找优化技术。
后记
这篇文章我准备了很久,迟迟没有公开,也找了很多准备材料,但是实际写来,只有这么多,以后如果有新的发现我会随时补充。欢迎大家提出意见。
另外,此片文章应该是J2ME系列的最后一篇了,我在一段时间内暂时不会涉及到这方面的文章。以后我会谈一下对开发测试流程以及设计方面的问题。