实验回顾:Lab5
实验目标:Static and Dynamic Code Analysis and Performance Optimization
本次实验通过对Lab4的代码进行静态和动态分析,发现代码中存在的不符合代码规范的地方、具有潜在bug的地方、性能存在缺陷的地方(执行时间热点、内存消耗大的语句、函数、类),进而使用第4、7、8章所学的知识对这些问题加以改进,掌握代码持续优化的方法,让代码既“看起来很美”,又“运行起来很美”。
具体训练的技术包括:
⚫ 静态代码分析(CheckStyle和SpotBugs)
⚫ 动态代码分析(Java命令行工具jstat、jmap、jcmd、VisualVM、JMC、JConsole等)
⚫ JVM内存管理与垃圾回收(GC)的优化配置
⚫ 运行时内存导出(memory dump)及其分析(Java命令行工具jhat、MAT)
⚫ 运行时调用栈及其分析(Java命令行工具jstack);
⚫ 高性能I/O
⚫ 基于设计模式的代码调优
⚫ 代码重构
个人觉得,本次实验的内容很无聊,因为这些分析都是通过工具完成,自己没什么可以创造的空间。
第一部分:静态代码分析
对于CheckStyle,我的评价不高,感觉他没什么用:只是给你一个标准,让你去格式化代码,去符合他自己给定的标准。但是话说回来,良好的代码风格确实能增加可读性,是一种好的编程习惯。
1.Checkstyle:import不要使用星号格式,而且要按字典序排列
解决方法:在Eclipse中应用一个Google的代码标准
2. Checkstyle:for,if结构都必须加上大括号
3.CheckStyle:'STATIC_INIT 前应有空行。
第二部分:性能优化
这里就是多种I/O方式之间的比较,比较结果就是“长江后浪推前浪”,Buffer和Writer/Scanner总是要优于Stream。
第三部分:垃圾收集
这部分也很无聊,就是用各种工具分析程序执行过程中对于垃圾回收的情况。但是通过内存到处还是能很清楚地看到程序的内存使用情况的。
第四部分:使用设计模式
这部分也是,设计模式用了很多,程序效率没什么提高。
1.用Flyweight设计模式设计的电子类:
工厂方法:
2. 基于Prototype 设计模式的思想改造程序,支持clone :以Track为例
- 对程序中使用的各种临时性的集合类或其他构造代价高的对象,使用Singleton 和Object Pool 设计模式的思想进行改造;
package physicalObject;
import track.Track;
public class ElectronFactory {
private static ElectronFactory factory;
public static ElectronFactory getFactory() {
if (factory == null)
factory = new ElectronFactory();
return factory;
}
public List<MyObject> get(MyObject e, Track t) {
List<MyObject> l = new ArrayList<>();
l.addobject(e);
return l;
}
}
- 对程序中使用的各种简单对象,使用canonicalization 的思想对其进行改造,降低构造对象的数量;
修改前:
private final double radius;
private final String form;
private final double speed;
private final String direction;
private final String color;
修改后:
private final double radius;
private final int form;
private final double speed;
private final boolean direction;
private final String color;