0%

Java内记录代码块执行时间最佳实践

一、计时点名称必须具有可读性

计时点名称必须具有可读性,制订如下两条原则:

  1. 开始计时点名称与相应的结束计时点名称具有一致性,比如“s0和e0”,“s00和e00”
  2. 层次结构计时点的名称体现层次性,比如“s,s0,s00”

例子见示例代码1。

二、时间统计代码与业务逻辑代码进行分隔

使用“花括号对”对时间统计代码与业务逻辑代码进行分隔,具体是:开始计时点紧邻一个左花括号而开始,相应的结束计时点紧邻相应的右花括号而结束,该“<开始计时点,结束计时点>对”负责统计的业务逻辑代码块置于上述“<左花括号,右花括号>对”之间。
例子见示例代码1。

示例代码1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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

这会导致代码可读性变差,使用“花括号对”对时间统计代码与业务逻辑代码进行分隔也不再可行,而且你很快就会丢失“所统计时间区间的逻辑含义”信息。代码示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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

针对上述代码,修改后内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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");
}
}
您的支持将鼓励我继续分享!