统计方法耗时的三种秘法

统计方法耗时的三种秘法

  • 1. 统计方法耗时的三种秘法
    • 1.1 `System.currentTimeMillis()` 统计法
    • 1.2 `org.springframework.util.StopWatch` 统计法
    • 1.3 `com.google.common.base.Stopwatch` 统计法

1. 统计方法耗时的三种秘法

统计方法耗时一般有三种方法。

1.1 System.currentTimeMillis() 统计法

        Long start=System.currentTimeMillis();
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        Long stop=System.currentTimeMillis();
        log.info("共耗时:{}毫秒",stop-start);

执行结果:

共耗时:104毫秒

1.2 org.springframework.util.StopWatch 统计法

        StopWatch stopWatch=new StopWatch("org.springframework.util.StopWatch耗时统计");
        stopWatch.start("任务一");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        stopWatch.stop();
        stopWatch.start("任务二");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        stopWatch.stop();
        log.info("共耗时:{}",stopWatch.prettyPrint());

使用spring工具包中的统计方法,优点在于功能丰富,支持多任务汇总统计,缺点单位换算需要自己处理,默认单位毫秒。

'org.springframework.util.StopWatch耗时统计': running time (millis) = 3004
-----------------------------------------
ms     %     Task name
-----------------------------------------
01000  033%  任务一
02004  067%  任务二

1.3 com.google.common.base.Stopwatch 统计法

        Stopwatch stopwatch=Stopwatch.createStarted();
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        stopwatch.stop();
        Stopwatch stopwatch2=Stopwatch.createStarted();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        stopwatch2.stop();
        log.info("\r\n任务一共耗时:{}\r\n任务二共耗时:{}",stopwatch,stopwatch2);

返回结果:

任务一共耗时:12.55 ms
任务二共耗时:2.000 s

使用google guava包中的方法,这种方式的好处是程序的toString方法会自动换算单位,缺点是功能不够丰富。

如果统计耗时纳秒值小于一毫秒,使用微秒做为单位
如果统计耗时纳秒值大于一毫秒,小于一秒,使用毫秒做为单位
如果统计耗时纳秒值大于一秒小于一分钟,使用秒作为单位
如果统计耗时纳秒值大于一分钟小于一小时,使用分钟作为单位
如果统计耗时纳秒值大于一小时,使用小时作为单位
如果统计耗时纳秒值大于一天,使用天作为单位

com.google.common.base.Stopwatch中的toString() 方法相关代码实现:

    public String toString() {
        long nanos = this.elapsedNanos();
        TimeUnit unit = chooseUnit(nanos);
        double value = (double)nanos / (double)TimeUnit.NANOSECONDS.convert(1L, unit);
        String var6 = Platform.formatCompact4Digits(value);
        String var7 = abbreviate(unit);
        return (new StringBuilder(1 + String.valueOf(var6).length() + String.valueOf(var7).length())).append(var6).append(" ").append(var7).toString();
    }
    private static TimeUnit chooseUnit(long nanos) {
        if (TimeUnit.DAYS.convert(nanos, TimeUnit.NANOSECONDS) > 0L) {
            return TimeUnit.DAYS;
        } else if (TimeUnit.HOURS.convert(nanos, TimeUnit.NANOSECONDS) > 0L) {
            return TimeUnit.HOURS;
        } else if (TimeUnit.MINUTES.convert(nanos, TimeUnit.NANOSECONDS) > 0L) {
            return TimeUnit.MINUTES;
        } else if (TimeUnit.SECONDS.convert(nanos, TimeUnit.NANOSECONDS) > 0L) {
            return TimeUnit.SECONDS;
        } else if (TimeUnit.MILLISECONDS.convert(nanos, TimeUnit.NANOSECONDS) > 0L) {
            return TimeUnit.MILLISECONDS;
        } else {
            return TimeUnit.MICROSECONDS.convert(nanos, TimeUnit.NANOSECONDS) > 0L ? TimeUnit.MICROSECONDS : TimeUnit.NANOSECONDS;
        }
    }

    private static String abbreviate(TimeUnit unit) {
        switch (unit) {
            case NANOSECONDS:
                return "ns";
            case MICROSECONDS:
                return "μs";
            case MILLISECONDS:
                return "ms";
            case SECONDS:
                return "s";
            case MINUTES:
                return "min";
            case HOURS:
                return "h";
            case DAYS:
                return "d";
            default:
                throw new AssertionError();
        }
    }

你可能感兴趣的:(#,Java中的测试秘术,java,spring,开发语言)