原文地址: http://wiki.forum.nokia.com/index.php/Java_ME_code_optimization
版权声明:语文能力有限,看不懂别找我。纯属免费,请随便转帖。别告诉别人是我写的。
J2ME 应用一般不像本地的C++应用一样运行。J2ME程序性能的降低总是体现在执行速度和内存这两个方面。(应用相关的一系列)因素例如I/O, 线程等有助于改进J2ME程序的性能。下面的一系列小建议是在考虑这些因素的基础上提出的,目的是为了提高J2ME应用的性能。
建议:
1. 创建对象和抛弃对象:
创建对象是既耗费内存又耗费性能的一件工作。仅当必要的时候采取创建对象,尽量不要在循环中创建对象。
例如:
2. Strings and StringBuffers
无论何时当你使用substring 或者 "+"运算符, 一个新的字符串对象就被创建了。所以如果你正在你的代码中操作字符串,例如:substring,字符串拼接, 请使用StringBuffer 或者char数组来完成这个工作。
3. 优化循环
原则1: 尽量使用for循环而不是while循环; 原则2:在循环条件中不要计算任何东西。
//下面是不好的代码
//下面是好的代码
4. 把你的程序分成部分
MIDP运行环境仅在需要时载入他们需要的类,因此把你的类从大类分成小类。
只import 你需要的类,不要使用通配符来引入类,例如:不是用java.util.* 而是 java.util.Date;
尽量保持一个类变量时public,这样就不必提供get方法和set方法,毕竟方法调用时需要耗费性能的。
(当然,如果仅仅是本类使用,请尽量保持private,这样一旦出了问题,调试方便)
5. 尽量不要用线程
无论何时请尽量不要使用线程,线程是内存和CPU的杀手。一些行为例如I/O是必须要用线程的,那就看看这个I/O是否避免(或者与已有线程合并)。
使用线程的时候通常会用到synchronized(同步),这会使性能降低2/3。
6. 避免频繁的打开RecordStores
如果使用RecordStores, 把对它的操作尽可能的集中放在一个位置, 这需要细心的设计。RecordStore的读写泛滥将严重影响性能。尽量通过细致设计减少RecordStore的open和close。
7. 重用GUI控件(略)
8. 针对变量的功能使用恰当的类型,这样避免浪费内存
9. 重用变量
尽可能的重用已有的变量,即使是程序段中的自动变量(例如通常的int i), 如果分配很多的话,也会拖慢速度并耗费内存。频繁的分配和释放变量必然导致性能的下降。当然,别用的太过分,毕竟把所有的变量都弄成全局的也是不可能的,而且也就没法设计了(意译)。
10. 数组滥用
把多维数组改为多个单位数组。多维数组的存取是性能杀手,尽量别用它们。
11. 计算
尽量用移位操作代替算术操作,例如int a = 11 << 1 代替 int a = 11 * 2;
尽可能的避免乘除运算的次数,它们比加减运算昂贵的多(注:在底层大概差一到两个数量级,也就是完成一次乘法操作的时间,足以完成10~100次加减法,甚至更多,臆测,未考证)。尽量用加减代替乘除。
12. 尽量使用已有的库中的函数功能(注:已有的函数除了bug比较少外,性能上肯定已经过几代的优化)。
例如在字符串中搜索,没必要自己写方法,尽量用String.indexOf或者String.lastIndexOf();
13. 内部类
For inner classes choose package scope with static.(在说鸟语,没看懂)
使用混淆器混淆代码,会提高性能
不要自己主动gc: System.gc()
14. 尽可能的降低循环次数
虽然循环让人生变得美好,但美好本身就是既耗费性能的东东。如果循环次数已知,那么通过增加循环语句减少循环次数,会提高性能(这个有点悬)。
例如:
上面的代码可以这么干:
(注:的确有人在研究是用循环还是把代码直接扩展出来,哪个效率高些,不过俺总觉得这个属于玩花活的范畴,不敢苟同)
15. 尽量别用多态
多态在Java里真是个好东西,能干好多事(请幻想所有的设计模式), 但是多态调用在Java调用中是花费最大的调用。最便宜的是static方法,当然俺也不是说让你把所有方法都整成static的,那样就啥也干不了的。
原文地址: http://wiki.forum.nokia.com/index.php/Java_ME_code_optimization
版权声明: 语文能力有限,看不懂别找我。纯属免费,请随便转帖。别告诉别人是我写的。
有错字请告诉我,我改!!