0%

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

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

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

  1. 开始计时点名称与相应的结束计时点名称具有一致性,比如“s0和e0”,“s00和e00”
  2. 层次结构计时点的名称体现层次性,比如“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");
    }
}
您的支持将鼓励我继续分享!