1. 代码优化,和性能优化不一样
代码优化的目标是:
- 减小代码的体积
- 提高代码运行的效率
- 尽量重用对象
特别是 String 对象的使用,出现字符串连接时应该使用 StringBuilder。连接池、线程池
- 尽可能使用局部变量
调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中,速度较快。其他变量,如静态变量、实例变量等,都在堆中创建,速度较慢。另外,栈中创建的变量,随着方法的运行结束,这些内容就没了,不需要额外的垃圾回收。
- 尽量减少对变量的重复计算
因为 array 其实是个特殊的 object,需要遍历 object 才知道长度:
for (var i = 0, length = list.length; i < length; i++)
- 尽量采用懒加载的策略,即在需要的时候才创建
String str = "aaa";
if (i == 1)
{
list.add(str);
}
建议替换为:
if (i == 1)
{
String str = "aaa";
list.add(str);
}
- 乘法和除法使用移位操作
for (val = 0; val < 100000; val += 5)
{
a = val * 8;
b = val / 2;
}
用移位操作可以极大地提高性能,因为在计算机底层,对位的操作是最方便、最快的,因此建议修改为:
for (val = 0; val < 100000; val += 5)
{
a = val << 3;
b = val >> 1;
}
移位操作虽然快,但是可能会使代码不太好理解,因此最好加上相应的注释。
- 循环内不要不断创建对象引用
for (int i = 1; i <= count; i++)
{
Object obj = new Object();
}
这种做法会导致内存中有 count 份 Object 对象引用存在,count 很大的话,就耗费内存了,建议为改为:
Object obj = null;
for (int i = 0; i <= count; i++)
{
obj = new Object();
}
- 尽量在合适的场合使用单例
使用单例可以减轻加载的负担、缩短加载的时间、提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面:
控制资源的使用,通过线程同步来控制资源的并发访问
控制实例的产生,以达到节约资源的目的
控制数据的共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信
程序运行过程中避免使用反射
使用数据库连接池和线程池
这两个池都是用于重用对象的,前者可以避免频繁地打开和关闭连接,后者可以避免频繁地创建和销毁线程
- 使用带缓冲的输入输出流进行 IO 操作
带缓冲的输入输出流,即 BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream
,这可以极大地提升 IO 效率
- 顺序插入和随机访问比较多的场景使用 ArrayList,元素删除和中间插入比较多的场景使用 LinkedList