最近在学习项目优化的知识,虽然jvm优化,数据库优化,项目架构优化这些都可以使项目的性能有一定的提高,但是如果代码本身存在着性能问题,那么在其他地方怎么优化也不会达到效果最优
代码优化
-
尽可能使用局部变量
- 调用方法时传递参数以及在调用中创建的临时变量都保存在栈中速度快,其他 静态变量、实例变量、大对象等,都是在堆中,速度慢,
- 不需要额外GC:栈中对象随着方法运行结束,内容就没了
-
尽量减少堆变量的重复计算
- 这个时候明确一个概念,对方法的调用,即便方法中只有一句语句,也是有消耗的。所以例如下面操作
for (int i = 0; i < list.size(); i++){ ....... } 我以前就这样写 嘻嘻嘻建议替换为:
int length = list.size(); for (int i = 0; i < length; i++){ ............ }这样写呢,如果在list.size()很大的时候,就会减少很多消耗
-
尽量采用懒加载的策略,就是什么时候用到什么时候加载
String str = "my"; if (1 == i){ list.add(str); } //建议换成 if (1 == i){ String str = "my"; list.add(str); } -
异常不要用来控制程序流程
异常对性能不利,抛出异常首先要创建一个新的对象,Throwable接口的构造函数调用名为fillInStackTrace()的本地同步方法,fillInStackTrace()方法检查堆栈,收集调用跟踪信息,只要有异常被抛出,Java虚拟机就必须调用堆栈,因为在处理过程中创建了一个新的对象,异常只能用于错误处理,不应该用来控制程序流程
-
不要将数组声明为 public static final(你有没有这样写过)
这样写毫无意义,这样只是定义了引用为static final,数组的内容还是可以随便修改的,将数组声明为 public 更是一个安全漏洞,这就意味着这个数组可以被外部类所改变。
-
不要创建一些不使用的对象,不要导入不使用的类
不使用 创建导入这样做没有意义。当你的代码中出现 "The value of the local variable is not used"、"The import java.util is never used",这个时候,请你删除这些无用内容
-
程序运行的时候避免使用反射
反射是Java提供给用户一个很强大的功能,功能强大往往代表着效率不高,不要在程序运行过程中使用尤其频繁使用反射机制,特别是Method的invoke方法。
当然如果必须使用,尽量在项目启动的时候就将通过反射实例化出一个对象并放入内存。
-
使用数据库连接池和线程池
这两个池都是为了重用对象的,前者可以避免频繁打开和关闭连接,后者可以避免频繁创建和销毁线程
-
容器初始化时尽可能指定长度
如 new ArrayList<>(10); new HashMap<>(32); 避免容器长度不足时,扩容带来性能消耗
-
ArrayList 随机遍历快,LinkedList添加删除快
ArrayList 数组 下标遍历快,LinkedList 链表添加删除的时候不需要位移只需要改变指向就好
- 使用 Entry遍历Map
```
Map<String,String> map = new HashMap<>();
for (Map.Entry<String,String> entry : map.entrySet()){
String key = entry.getKey();
String value = entry.getValue();
}
```
避免使用这种下边这种,下边遍历两次,上边遍历一次
```
Map<String,String> map = new HashMap<>();
for (String key : map.keySet()){
String value = map.get(key);
}
```
- 不要手动调用System.gc();
你手动调用这个,有可能会妨碍系统的判断,你要相信 jvm会更知道什么时候该GC。
-
String尽量少用正则表达式
正则表达式虽然功能强大,但是效率低,除非是有需要,否则尽可能少用 replace() 不支持正则 replaceAll() 支持 如果是仅仅字符串的替换建议使用replace()
-
日志的输出注意级别
```
//当前的日志级别是error
LOGGER.info("保存出错!" + user);
```
15. 对资源的close()最好分开操作
```
try{
xxx.close();
yyy.close();
}
catch (Exception e){
.....
}
//建议改为
try{
xxx.close();
}
catch (Exception e){
....
}
try{
yyy.close();
}
catch (Exception e){
}
```