已经深夜了,郁闷的很,又没啥事可做,就写写JAVA的一些编程技巧吧。
一、准则
二、编译器选项
三、分析
四、整数的运算
五、实例化
六、预计算
七、循环的优化
八、方法/类
九、运算符优化
十、关于流
一、准则
首先检查算法。在绝大多数情况下,对算法做适当的改进能最有效地提高性能。因此在着手开始“低级”JAVA代码优化时,务必首先检查算法。
二、编译器选项
现在大多数编辑器,都能自动优化编译,但有的还是不行。
例如:手动优化化码编译
javac -O YourClass.java
三、分析
用工具分析代码的性能,SUN的JDK就内置了剖面分析选项。
如:
java -prof YourClass (对应用程序)
java -prof sun.applet.AppletViewer YourPage.html (对Applets)
这会输出文件java.prof
四、整数的运算
在可能的情况下,尽量的使用整数运算,而不要用浮点运算。
也就是说,能使用int型的情况下,不要使用double和float型,因为int运算要比double和float快得多。最好不要使用short类型,大部分的方法都返回int型值,而short经常要被转换成int。效率就低了。
例如:
double r = Math.random();
double x = dddd * r;
double y = cccc * r;
上面的运算要比下面的运算慢
int r = Math.random() * 100;
int x = ddd * r /100;
int y = ccc * r /100;
五、实例化
创建一个对象通常是很慢很费时间的。最好能避免new操作,当然,不用new是不可能的,但最好是重用已经存在的对象。这是非常有好处的,因为这样可以减少很多内存的消耗和废料收集。
六、预计算
把与循环不变量代码移出循环,将方法不变量计算移到构造方法或者init()方法中。
例如:
for(int i=0;i<360;i++) {
x = i * (a / (180/3.14));
// Other Code
}
经过代码优化后,变成:
aRad = a / (180/3.14);
for(int i=0;i<360;i++) {
x = i* aRad;
}
七、循环的优化
首先确保循环计数的变量是局部整型变量而不是实例变量或者类变量。
例如:
for (int i = 0;i < max; i++)
经过优化:
for(int i = max;--i >= 0; )
这样的循环有两个优点:
1,与常数进行比较操作通常比与另一个变量进行比较操作要快得多。
2,在比较表达式中,直接使用递减运算符比递增运算符快得多。
顺便补充一点:
用循环将数组从一个数组转移到另一个粗组,使用arraycopy()方法要快很多。
八、方法/类
只要有可能,就声明类为final。这是有助于提高程序效率的有效方法。因为JAVA解释器就不用在子类中查找被重设的方法了。
如果有可能,大多数方法应声明为私有的(private),最终的(final)或者是静态的(static)。而公用方法(public)是需要被其他类调用的时候。
而对于同步,仅当有必要时才声明方法为同步。
如果被调用的方法体很小,那直接写成在线代码会好一些。
例如:
mVar = Math.max(aVar,bVar);
优化后:
mVar = aVar > bVar ? aVar : bVar;
PS: 对于 ?: 表达式,无论在C、C++或者JAVA中都是非常推崇的。
九、运算符优化
提示:使用运算符访问对象和实例变量是很费时间的。应当避免复杂的层结构。
如对象调用的时候
A.B.C.D = 0;
A.B.C.E = null;
A.B.C.F = "StringName";
这样的代码应该不要出现。
经过优化得到:
P = A.B.C;
P.D = 0;
P.E = null;
P.F = "StringName";
十、关于流
这里只简单的举个例子。因为流的操作有些复杂,本人还只是皮毛。所以只能小打小闹一下了。
尽量使用缓冲I/O操作。
使用非缓冲I/O会引发许多的类似于InputStream.read()方法的调用。这在分析如从网络传来的命令或从硬盘读取的配置数据等输入流的代码中很普通。