Java程序性能优化总结
2016-05-23 17:27
901 查看
1.避免在循环条件中使用复杂表达式
在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循
环条件值不变的话,程序将会运行的更快。
例子:
更正:
2.为'vectors' 和 'hashtables'定义初始大小
jvm 为 vector 扩充大小的时候需要重新创建一个更大的数组,将原原先数组中的内容复制过
来,最后,原先的数组再被回收。可见 vector 容量的扩大是一个颇费时间的事。
通常,默认的 10 个元素大小是不够的。你最好能准确的估计你所需要的最佳大小。
3.在 finally 块中关闭 stream
程序中使用到的资源应当被释放,以避免资源泄漏。这最好在 finally 块中去做。不管程序执行
的结果如何,finally 块总是会执行的,以确保资源的正确关闭。
4.使用'system.arraycopy ()'代替通过来循环复制数组
'system.arraycopy ()' 要比通过循环来复制数组快的多。
5.让访问实例内变量的 getter/setter 方法变成”final”
简单的 getter/setter 方法应该被置成 final,这会告诉编译器,这个方法不会被重载,所以,可
以变成”inlined”
6.避免不需要的 instanceof 操作
7.单个字符使用char代替String,譬如indexof,startswith()
8.使用移位操作来代替'a / b'操作
"/"是一个很“昂贵”的操作,使用移位操作将会更快更有效。
例子:
更正:
9、使用移位操作代替'a * b'同上。
[i]但我个人认为,除非是在一个非常大的循环内,性能非常重要,而且你很清楚你自己在做什
么,方可使用这种方法。否则提高性能所带来的程序晚读性的降低将是不合算的。
例子:
更正:
在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循
环条件值不变的话,程序将会运行的更快。
例子:
import java.util.vector; class cel { void method (vector vector) { for (int i = 0; i < vector.size (); i++) // violation ; // ... } }
更正:
class cel_fixed { void method (vector vector) { int size = vector.size () for (int i = 0; i < size; i++) ; // ... } }
2.为'vectors' 和 'hashtables'定义初始大小
jvm 为 vector 扩充大小的时候需要重新创建一个更大的数组,将原原先数组中的内容复制过
来,最后,原先的数组再被回收。可见 vector 容量的扩大是一个颇费时间的事。
通常,默认的 10 个元素大小是不够的。你最好能准确的估计你所需要的最佳大小。
3.在 finally 块中关闭 stream
程序中使用到的资源应当被释放,以避免资源泄漏。这最好在 finally 块中去做。不管程序执行
的结果如何,finally 块总是会执行的,以确保资源的正确关闭。
4.使用'system.arraycopy ()'代替通过来循环复制数组
'system.arraycopy ()' 要比通过循环来复制数组快的多。
5.让访问实例内变量的 getter/setter 方法变成”final”
简单的 getter/setter 方法应该被置成 final,这会告诉编译器,这个方法不会被重载,所以,可
以变成”inlined”
6.避免不需要的 instanceof 操作
7.单个字符使用char代替String,譬如indexof,startswith()
8.使用移位操作来代替'a / b'操作
"/"是一个很“昂贵”的操作,使用移位操作将会更快更有效。
例子:
public class sdiv { public static final int num = 16; public void calculate(int a) { int div = a / 4; // should be replaced with "a >> 2". int div2 = a / 8; // should be replaced with "a >> 3". int temp = a / 3; } }
更正:
public class sdiv { public static final int num = 16; public void calculate(int a) { int div = a >> 2; int div2 = a >> 3; int temp = a / 3; // 不能转换成位移操作 } }
9、使用移位操作代替'a * b'同上。
[i]但我个人认为,除非是在一个非常大的循环内,性能非常重要,而且你很清楚你自己在做什
么,方可使用这种方法。否则提高性能所带来的程序晚读性的降低将是不合算的。
例子:
public class smul { public void calculate(int a) { int mul = a * 4; // should be replaced with "a << 2". int mul2 = 8 * a; // should be replaced with "a << 3". int temp = a * 3; } }
更正:
package opt; public class smul { public void calculate(int a) { int mul = a << 2; int mul2 = a << 3; int temp = a * 3; // 不能转换 } }
相关文章推荐
- Java synchronized详解
- JAVA基础第十组(5道题)
- JAVA基础第九组(5道题)
- JAVA基础第八组(5道题)
- JAVA基础第七组(5道题)
- JAVA基础第六组(5道题)
- Java_类的热替换
- Java之Semaphore
- JAVA基础第五组(5道题)
- (spring-第18回【AOP基础篇】) 创建切面
- JAVA基础第四组(5道题)
- JAVA基础第三组(5道题)
- JAVA基础第二组(5道题)
- Junit配合Spring单元测试
- JAVA基础第一组(前5道题)
- 深入分析Java的序列化与反序列化
- struts2校验器验证表单避免无效sql查询
- Realm Java的学习、应用、总结
- java 静态代码块与非静态代码块
- Jdk1.7自带的FTP文件上传下载