从JAVA角度优化CPU,内存,磁盘
一、CPU
- 尽量让cpu少干活
1.减少重复计算
可利用临时变量存储,数据比较多时用map
缓存优化:当从po计算到vo的逻辑太过复杂时,在中间缓存一层bo,再加一个本地缓存
2.减少数据量
3.sql优化
4.合并小请求,拆分大请求 - 多线程
1.利用线程池添加并行度,线程池的七个参数要设计的合理一点
2.降低锁的粒度 - cpu缓存
1.减少cpu缓存的刷新次数,此优化点不大,对整体影响比较小,但如果追求一个极致的性能可以做
例子:有两个嵌套循环
情况一:外循环100000000次,内循环10次;
long s = System.currentTimeMillis();
long count=0;
long count1=0;
for (int i = 0; i < 100000000; i++) {
long a1 =1, b1 =1, c1 =1, d1 =1, e1 =1, f1 =1, g1 =1, h1 = 1;
count1 = count1 + a1 + b1 + c1 + d1 + e1 + f1 + g1 + h1;
for (int j = 0; j < 10; j++) {
long a =1, b =1, c =1, d =1, e =1, f =1, g =1, h = 1;
count = count + a + b + c + d + e + f + g + h;
}
}
System.out.println(System.currentTimeMillis()-s);
System.out.println(count);
System.out.println(count1);
情况二:外循环10次,内循环100000000次;
long s = System.currentTimeMillis();
long count=0;
long count1=0;
for (int i = 0; i < 10; i++) {
long a1 =1, b1 =1, c1 =1, d1 =1, e1 =1, f1 =1, g1 =1, h1 = 1;
count1 = count1 + a1 + b1 + c1 + d1 + e1 + f1 + g1 + h1;
for (int j = 0; j < 100000000; j++) {
long a =1, b =1, c =1, d =1, e =1, f =1, g =1, h = 1;
count = count + a + b + c + d + e + f + g + h;
}
}
System.out.println(System.currentTimeMillis()-s);
System.out.println(count);
System.out.println(count1);
情况一相对情况二缓存刷新次数较多,所以性能较低,一般把循环次数少的放在外面稍微好点
二、内存
1.不创建无用对象和重复对象
2.内存淘汰
lru、lfu、软引用等
三、磁盘
1.减少IO次数
2.随机写变顺序写
3.随机读时利用零拷贝和page cache