美文网首页java
GUAVA STOPWATCH源码解析

GUAVA STOPWATCH源码解析

作者: zhuke | 来源:发表于2017-06-09 16:23 被阅读1885次

问题

一直在使用如下代码进行程序耗时计算和性能调试,但是对其返回值代表的具体意义却不甚了解。

Stopwatch stopwatch = Stopwatch.createStarted();
doSomething();
stopwatch.stop(); // optional
long millis = stopwatch.elapsed(MILLISECONDS);
log.info("time: " + stopwatch); // formatted string like "12.3 ms"

查看源码发现其代码并不复杂,下面就对其源码进行剖析和解释。

源码剖析

public final class Stopwatch {
  private final Ticker ticker;//计时器,用于获取当前时间
  private boolean isRunning;//计时器是否运行中的状态标记
  private long elapsedNanos;//用于标记从计时器开启到调用统计的方法时过去的时间
  private long startTick;//计时器开启的时刻时间
}

通过对elapsedNanos、startTick结合当前时刻时间,可以计算出我们所需要的程序运行流逝的时间长度。

首先来看Ticker工具类:

public static Stopwatch createStarted() {
    return new Stopwatch().start();
}

Stopwatch() {
    this.ticker = Ticker.systemTicker();
  }


private static final Ticker SYSTEM_TICKER =
      new Ticker() {
        @Override
        public long read() {
          //ticker工具类read方法,直接获取机器的毫秒时间
          return Platform.systemNanoTime();
        }
      };


static long systemNanoTime() {
    return System.nanoTime();
  }

StopWatch的几个关键方法:

public Stopwatch start() {
    checkState(!isRunning, "This stopwatch is already running.");
    isRunning = true;
    startTick = ticker.read();//设置startTick时间为stopwatch开始启动的时刻时间
    return this;
  }
public Stopwatch stop() {
    long tick = ticker.read();
    checkState(isRunning, "This stopwatch is already stopped.");
    isRunning = false;
    //设置elapsedNanos时间为方法调用时间-stopwatch开启时间+上次程序stopwatch的elapsedNanos历史时间 
    elapsedNanos += tick - startTick;
    return this;
  }

public long elapsed(TimeUnit desiredUnit) {
    return desiredUnit.convert(elapsedNanos(), NANOSECONDS);
  }


private long elapsedNanos() {
    //如果stopwatch仍在运行中,返回当前时刻时间-stopwatch开启时刻时间+历史elapsedNanos时间(elapsedNanos只在stop和reset时会更新)
    //如果stopwatch已停止运行,则直接返回elapsedNanos,详见stop()
    return isRunning ? ticker.read() - startTick + elapsedNanos : elapsedNanos;
  }

结论

调用方式1:

Stopwatch stopwatch = Stopwatch.createStarted();
doSomething();
stopwatch.stop(); // optional
long millis = stopwatch.elapsed(MILLISECONDS);
log.info("time: " + stopwatch); // formatted string like "12.3 ms"

使用stopwatch对程序运行时间进行调试,首先调用StopWatch.createStarted()创建并启动一个stopwatch实例,调用stopwatch.stop()停止计时,此时会更新stopwatch的elapsedNanos时间,为stopwatch开始启动到结束计时的时间,再次调用stopwatch.elapsed(),获取stopwatch在start-stop时间段,时间流逝的长度。

调用方式2:

Stopwatch stopwatch = Stopwatch.createStarted();
doSomething();
//stopwatch.stop();
long millis = stopwatch.elapsed(MILLISECONDS);
log.info("time: " + stopwatch); // formatted string like "12.3 ms"

createStarted启动了一个stopwatch实例,stopwatch的时间持续流逝,调用elapsed方法,返回isRunning ? ticker.read() - startTick + elapsedNanos : elapsedNanos;,此时得到的返回值是当前时间和stopwatch.start()时刻时间的时间差值,所以是一个持续递增的时间。

如果需要在程序中对关键步骤的每一步进行进行持续度量,需要使用如下调用方式

Stopwatch stopwatch = Stopwatch.createStarted();
doSomething();
stopwatch.stop();
long millis = stopwatch.elapsed(MILLISECONDS);
log.info("time: " + stopwatch); // formatted string like "12.3 ms"

stopwatch.reset().start();
doSomething();
stopwatch.stop();
long millis = stopwatch.elapsed(MILLISECONDS);
log.info("time: " + stopwatch); // formatted string like "12.3 ms"

相关文章

  • GUAVA STOPWATCH源码解析

    问题 一直在使用如下代码进行程序耗时计算和性能调试,但是对其返回值代表的具体意义却不甚了解。 查看源码发现其代码并...

  • [Guava]Stopwatch 源码分析

    是什么 Stopwatch 解释为计时器,又称秒表、停表,很明显它是记录时间的。 如何使用 安卓使用: 看了上面这...

  • Guava 用法

    1.Guava 的用法和源码解析

  • Guava之StopWatch

    查看 StopWatch 源码 底层有用到ServiceLoader

  • StopWatch使用及源码解析

    使用背景 由于刚接手另一组开发的项目,发现其中接口耗时很长,所以决定查看到底哪里耗时长,进而思考如何进行优化 什么...

  • HBase:ERROR: tried to access met

    hbase scan时报错: 解决办法: 首先确认,Stopwatch在google的guava包下,果断开始查g...

  • Guava RateLimiter源码解析

    前言 在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流 缓存 缓存的目的是提升系统访问速度和增大系统处理...

  • Guava源码解析之EventBus

    最近看Elastic-Job源码,看到它里面实现的任务运行轨迹的持久化,使用的是Guava的AsyncEventB...

  • Guava RateLimiter限流源码解析

    RateLimiter的设计思想 RateLimiter最大的特点是它可以以一个稳定的速率让线程通过。当线程过多的...

  • 今天看Guava源码,碰到Stopwatch,它是什么鬼?

    推荐阅读: 这套Github上40K+star学习笔记,可以帮你搞定95%以上的Java面试 毫不夸张的说,这份S...

网友评论

    本文标题:GUAVA STOPWATCH源码解析

    本文链接:https://www.haomeiwen.com/subject/czhfqxtx.html