[Guava]Stopwatch 源碼分析

u=2486381870,3695897862&fm=27&gp=0.jpg

是什么

Stopwatch 解釋為計(jì)時(shí)器肉拓,又稱秒表鸭丛、停表竞穷,很明顯它是記錄時(shí)間的。

如何使用

Stopwatch stopwatch = Stopwatch.createStarted();
   doSomething();
 stopwatch.stop(); // optional

   long millis = stopwatch.elapsed(MILLISECONDS);
// formatted string like "12.3 ms"}

log.info("time: " + stopwatch);

安卓使用:

Stopwatch.createStarted(
         new Ticker() {
           public long read() {
             return android.os.SystemClock.elapsedRealtime();
            }
          });}

看了上面這段代碼鳞溉,有人會(huì)說瘾带,不用Stopwatch 照樣可以實(shí)現(xiàn)執(zhí)行時(shí)間的統(tǒng)計(jì),比如:

   long startTime = System.currentTimeMillis();

        try {
            // 模擬業(yè)務(wù)邏輯
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(System.currentTimeMillis() - startTime);

確實(shí)是熟菲,這樣也能統(tǒng)計(jì)這段代碼的執(zhí)行時(shí)間看政,那么為什么還會(huì)有Stopwatch(我也有這種想法)

官方稱不直接使用System#nanoTime是有一下幾個(gè)原因:

  • 時(shí)間源可以替代 可以重寫Ticker(下面會(huì)介紹)
  • nanoTime的返回值是納秒,返回的值沒有意義抄罕,Stopwatch抽象返回值

下面從實(shí)現(xiàn)方式來分析下guava為什么會(huì)設(shè)計(jì)這么類

源碼分析

內(nèi)部有幾個(gè)成員變量

  //時(shí)間源 一般和Stopwatch一起使用允蚣,而不是單獨(dú)使用
  private final Ticker ticker;
  private boolean isRunning;
  private long elapsedNanos;
  private long startTick;

先看下Ticker(是個(gè)abstract類) 都有什么:

  public static Ticker systemTicker() {
    return SYSTEM_TICKER;
  }

  private static final Ticker SYSTEM_TICKER =
      new Ticker() {
        @Override
        public long read() {
          // 實(shí)際上就是System.nanoTime();
          return Platform.systemNanoTime();
        }
      };
   
   // 子類重寫   
   public abstract long read();

回到Stopwatch,看下它的構(gòu)造方式:

  public static Stopwatch createUnstarted() {
    return new Stopwatch();
  }

  /**
   * Creates (but does not start) a new stopwatch, using the specified time source.
   *
   * @since 15.0
   */
  public static Stopwatch createUnstarted(Ticker ticker) {
    return new Stopwatch(ticker);
  }

  /**
   * Creates (and starts) a new stopwatch using {@link System#nanoTime} as its time source.
   *
   * @since 15.0
   */
  public static Stopwatch createStarted() {
    return new Stopwatch().start();
  }
  
 Stopwatch() {
    this.ticker = Ticker.systemTicker();
  }

  Stopwatch(Ticker ticker) {
    this.ticker = checkNotNull(ticker, "ticker");
  }
  

包括創(chuàng)建不啟動(dòng)呆贿,創(chuàng)建啟動(dòng)的構(gòu)造方式

執(zhí)行流程

start--> stop 或者 reset

看下代碼嚷兔,很簡(jiǎn)單


 public Stopwatch start() {
    // 先判斷是否處于執(zhí)行狀態(tài)
    checkState(!isRunning, "This stopwatch is already running.");
    isRunning = true;
    // 初始化 當(dāng)前的納秒時(shí)間
    startTick = ticker.read();
    return this;
  }

public Stopwatch stop() {
    long tick = ticker.read();
    checkState(isRunning, "This stopwatch is already stopped.");
    isRunning = false;
    elapsedNanos += tick - startTick;
    return this;
  }
  
  public Stopwatch reset() {
    elapsedNanos = 0;
    isRunning = false;
    return this;
  }

獲取結(jié)果的代碼:


  // 計(jì)算納秒
  private long elapsedNanos() {
    return isRunning ? ticker.read() - startTick + elapsedNanos : elapsedNanos;
  }

  // 轉(zhuǎn)換其他單位
  public long elapsed(TimeUnit desiredUnit) {
    return desiredUnit.convert(elapsedNanos(), NANOSECONDS);
  }


還有一些單位轉(zhuǎn)換和toString方法,就不分析了

總結(jié)

  • 支持TimeUnit,可以將計(jì)算后的時(shí)間轉(zhuǎn)換為各種單位
    比如:stopwatch.elapsed(TimeUnit.SECONDS))
  • 同一個(gè)Stopwatch谴垫,可以重置章母,重復(fù)記錄
  • 時(shí)間源可以替代 可以重寫Ticker
  • 其他
    Spring 也有StopWatch 實(shí)現(xiàn)方式差不多,不支持替換時(shí)間源和可以重置翩剪,支持毫秒和納秒乳怎,但是增加了Task的概念
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市前弯,隨后出現(xiàn)的幾起案子蚪缀,更是在濱河造成了極大的恐慌,老刑警劉巖恕出,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件询枚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡浙巫,警方通過查閱死者的電腦和手機(jī)金蜀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來的畴,“玉大人渊抄,你說我怎么就攤上這事∩ゲ茫” “怎么了护桦?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)煎娇。 經(jīng)常有香客問我二庵,道長(zhǎng),這世上最難降的妖魔是什么缓呛? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任催享,我火速辦了婚禮,結(jié)果婚禮上哟绊,老公的妹妹穿的比我還像新娘睡陪。我一直安慰自己,他們只是感情好匿情,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著信殊,像睡著了一般炬称。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涡拘,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天玲躯,我揣著相機(jī)與錄音,去河邊找鬼。 笑死跷车,一個(gè)胖子當(dāng)著我的面吹牛棘利,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播朽缴,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼善玫,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了密强?” 一聲冷哼從身側(cè)響起茅郎,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎或渤,沒想到半個(gè)月后系冗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡薪鹦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年掌敬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片池磁。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奔害,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出框仔,到底是詐尸還是另有隱情舀武,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布离斩,位于F島的核電站银舱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏跛梗。R本人自食惡果不足惜寻馏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望核偿。 院中可真熱鬧诚欠,春花似錦、人聲如沸漾岳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尼荆。三九已至左腔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捅儒,已是汗流浹背液样。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工振亮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鞭莽。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓坊秸,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親澎怒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子褒搔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容