一、计时点名称必须具有可读性 计时点名称必须具有可读性,制订如下两条原则:
开始计时点名称与相应的结束计时点名称具有一致性,比如“s0和e0”,“s00和e00”
层次结构计时点的名称体现层次性,比如“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"); } }