一、计时点名称必须具有可读性
计时点名称必须具有可读性,制订如下两条原则:
- 开始计时点名称与相应的结束计时点名称具有一致性,比如“s0和e0”,“s00和e00”
- 层次结构计时点的名称体现层次性,比如“s,s0,s00”
例子见示例代码1。
二、时间统计代码与业务逻辑代码进行分隔
使用“花括号对”对时间统计代码与业务逻辑代码进行分隔,具体是:开始计时点紧邻一个左花括号而开始,相应的结束计时点紧邻相应的右花括号而结束,该“<开始计时点,结束计时点>对”负责统计的业务逻辑代码块置于上述“<左花括号,右花括号>对”之间。
例子见示例代码1。
示例代码1
public class Main {
public void executionTimeRecordExample() {
long s = System.currentTimeMillis();
{
long s0 = System.currentTimeMillis();
{
long s00 = System.currentTimeMillis();
{
}
long e00 = System.currentTimeMillis();
}
long e0 = System.currentTimeMillis();
long s1 = System.currentTimeMillis();
{
long s10 = System.currentTimeMillis();
{
}
long e10 = System.currentTimeMillis();
}
long e1 = System.currentTimeMillis();
}
long e = System.currentTimeMillis();
}
}
三、禁止“一对多”关系
禁止复用计时点,导致产生“一对多”关系,如图1所示。
图1
这会导致代码可读性变差,使用“花括号对”对时间统计代码与业务逻辑代码进行分隔也不再可行,而且你很快就会丢失“所统计时间区间的逻辑含义”信息。代码示例如下:
public class Main {
public void example() {
long s = System.currentTimeMillis();
try {
// 代码块
long e0 = System.currentTimeMillis();
System.out.println("In normal process,it takes " + (e0 - s) + " ms");
} catch (Exception e) {
// 代码块
long e1 = System.currentTimeMillis();
System.out.println("In normal and exception process,it takes " + (e1 - s) + " ms");
}
}
public void example2() {
long s = System.currentTimeMillis();
// 代码块
long e0 = System.currentTimeMillis();
System.out.println("Firstly,it takes " + (e0 - s) + " ms");
// 代码块
long e1 = System.currentTimeMillis();
System.out.println("Secondly,it takes " + (e1 - s) + " ms");
}
}
遇到上述情形,应该进行转换,摒除“一对多”关系,如图2所示。
图2
针对上述代码,修改后内容如下:
public class Main {
public void exampleAlter() {
boolean expFlag = false;
long s = System.currentTimeMillis();
{
try {
long s0 = System.currentTimeMillis();
{
// 代码块
}
long e0 = System.currentTimeMillis();
if (!expFlag) {
System.out.println("In normal process,it takes " + (e0 - s0) + " ms");
}
} catch (Exception e) {
// 代码块
expFlag = true;
}
}
long e = System.currentTimeMillis();
if (expFlag) {
System.out.println("In normal and exception process,it takes " + (e - s) + " ms");
}
}
public void example2Alter() {
long s = System.currentTimeMillis();
{
long s0 = System.currentTimeMillis();
{
// 代码块
}
long e0 = System.currentTimeMillis();
System.out.println("Firstly,it takes " + (e0 - s0) + " ms");
// 代码块
}
long e = System.currentTimeMillis();
System.out.println("Secondly,it takes " + (e - s) + " ms");
}
}