zoukankan      html  css  js  c++  java
  • java stopwatch 功能

    C#中有一个stopwatch的功能,主要是用来监测程序执行时间的。java之前一直都在用如下方式完成:

     1     public static void main(String[] args) {
     2         long startTime=System.currentTimeMillis();   //获取开始时间
     3         
     4         //函数主体代码
     5         //...
     6 
     7         long endTime=System.currentTimeMillis(); //获取结束时间
     8         System.out.println("程序运行时间: "+(endTime-startTime)+"ms");
     9         
    10     }
    原生监测方式

    今天上网搜索了一下,找到了一个比较类似的:

    1 import org.apache.commons.lang3.time; 
    2 
    3         StopWatch watch=new  StopWatch();
    4         watch.start();
    5         watch.stop();
    6         watch.getSplitTime();    
    apache.commons.lang3

    但是上面的时间处理只支持ms,有些时间比较长还得自己处理,就又找了一个:

    1 import java.util.concurrent.TimeUnit;
    2 import com.google.common.base.Stopwatch;
    3 
    4         Stopwatch watch = new Stopwatch();
    5         watch.start();
    6         watch.stop();
    7         watch.elapsed(TimeUnit.MINUTES);
    google stopwatch

    时间可以支持多种格式,可以自由选择,但是看了下源码,感觉里面好多方法都是  @Deprecated,估计是比较老的api了:

      1 /*
      2  * Copyright (C) 2008 The Guava Authors
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  * http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.google.common.base;
     18 
     19 import static com.google.common.base.Preconditions.checkNotNull;
     20 import static com.google.common.base.Preconditions.checkState;
     21 import static java.util.concurrent.TimeUnit.MICROSECONDS;
     22 import static java.util.concurrent.TimeUnit.MILLISECONDS;
     23 import static java.util.concurrent.TimeUnit.NANOSECONDS;
     24 import static java.util.concurrent.TimeUnit.SECONDS;
     25 
     26 import com.google.common.annotations.Beta;
     27 import com.google.common.annotations.GwtCompatible;
     28 import com.google.common.annotations.GwtIncompatible;
     29 
     30 import java.util.concurrent.TimeUnit;
     31 
     32 /**
     33  * An object that measures elapsed time in nanoseconds. It is useful to measure
     34  * elapsed time using this class instead of direct calls to {@link
     35  * System#nanoTime} for a few reasons:
     36  *
     37  * <ul>
     38  * <li>An alternate time source can be substituted, for testing or performance
     39  *     reasons.
     40  * <li>As documented by {@code nanoTime}, the value returned has no absolute
     41  *     meaning, and can only be interpreted as relative to another timestamp
     42  *     returned by {@code nanoTime} at a different time. {@code Stopwatch} is a
     43  *     more effective abstraction because it exposes only these relative values,
     44  *     not the absolute ones.
     45  * </ul>
     46  *
     47  * <p>Basic usage:
     48  * <pre>
     49  *   Stopwatch stopwatch = new Stopwatch().{@link #start start}();
     50  *   doSomething();
     51  *   stopwatch.{@link #stop stop}(); // optional
     52  *
     53  *   long millis = stopwatch.elapsed(MILLISECONDS);
     54  *
     55  *   log.info("that took: " + stopwatch); // formatted string like "12.3 ms"
     56  * </pre>
     57  *
     58  * <p>Stopwatch methods are not idempotent; it is an error to start or stop a
     59  * stopwatch that is already in the desired state.
     60  *
     61  * <p>When testing code that uses this class, use the {@linkplain
     62  * #Stopwatch(Ticker) alternate constructor} to supply a fake or mock ticker.
     63  * <!-- TODO(kevinb): restore the "such as" --> This allows you to
     64  * simulate any valid behavior of the stopwatch.
     65  *
     66  * <p><b>Note:</b> This class is not thread-safe.
     67  *
     68  * @author Kevin Bourrillion
     69  * @since 10.0
     70  */
     71 @Beta
     72 @GwtCompatible(emulated = true)
     73 public final class Stopwatch {
     74   private final Ticker ticker;
     75   private boolean isRunning;
     76   private long elapsedNanos;
     77   private long startTick;
     78 
     79   /**
     80    * Creates (but does not start) a new stopwatch using {@link System#nanoTime}
     81    * as its time source.
     82    */
     83   public Stopwatch() {
     84     this(Ticker.systemTicker());
     85   }
     86 
     87   /**
     88    * Creates (but does not start) a new stopwatch, using the specified time
     89    * source.
     90    */
     91   public Stopwatch(Ticker ticker) {
     92     this.ticker = checkNotNull(ticker, "ticker");
     93   }
     94 
     95   /**
     96    * Returns {@code true} if {@link #start()} has been called on this stopwatch,
     97    * and {@link #stop()} has not been called since the last call to {@code
     98    * start()}.
     99    */
    100   public boolean isRunning() {
    101     return isRunning;
    102   }
    103 
    104   /**
    105    * Starts the stopwatch.
    106    *
    107    * @return this {@code Stopwatch} instance
    108    * @throws IllegalStateException if the stopwatch is already running.
    109    */
    110   public Stopwatch start() {
    111     checkState(!isRunning,
    112         "This stopwatch is already running; it cannot be started more than once.");
    113     isRunning = true;
    114     startTick = ticker.read();
    115     return this;
    116   }
    117 
    118   /**
    119    * Stops the stopwatch. Future reads will return the fixed duration that had
    120    * elapsed up to this point.
    121    *
    122    * @return this {@code Stopwatch} instance
    123    * @throws IllegalStateException if the stopwatch is already stopped.
    124    */
    125   public Stopwatch stop() {
    126     long tick = ticker.read();
    127     checkState(isRunning,
    128         "This stopwatch is already stopped; it cannot be stopped more than once.");
    129     isRunning = false;
    130     elapsedNanos += tick - startTick;
    131     return this;
    132   }
    133 
    134   /**
    135    * Sets the elapsed time for this stopwatch to zero,
    136    * and places it in a stopped state.
    137    *
    138    * @return this {@code Stopwatch} instance
    139    */
    140   public Stopwatch reset() {
    141     elapsedNanos = 0;
    142     isRunning = false;
    143     return this;
    144   }
    145 
    146   private long elapsedNanos() {
    147     return isRunning ? ticker.read() - startTick + elapsedNanos : elapsedNanos;
    148   }
    149 
    150   /**
    151    * Returns the current elapsed time shown on this stopwatch, expressed
    152    * in the desired time unit, with any fraction rounded down.
    153    *
    154    * <p>Note that the overhead of measurement can be more than a microsecond, so
    155    * it is generally not useful to specify {@link TimeUnit#NANOSECONDS}
    156    * precision here.
    157    *
    158    * @since 14.0 (since 10.0 as {@code elapsedTime()})
    159    */
    160   public long elapsed(TimeUnit desiredUnit) {
    161     return desiredUnit.convert(elapsedNanos(), NANOSECONDS);
    162   }
    163 
    164   /**
    165    * Returns the current elapsed time shown on this stopwatch, expressed
    166    * in the desired time unit, with any fraction rounded down.
    167    *
    168    * <p>Note that the overhead of measurement can be more than a microsecond, so
    169    * it is generally not useful to specify {@link TimeUnit#NANOSECONDS}
    170    * precision here.
    171    *
    172    * @deprecated Use {@link Stopwatch#elapsed(TimeUnit)} instead. This method is
    173    *     scheduled to be removed in Guava release 16.0.
    174    */
    175   @Deprecated
    176   public long elapsedTime(TimeUnit desiredUnit) {
    177     return elapsed(desiredUnit);
    178   }
    179 
    180   /**
    181    * Returns the current elapsed time shown on this stopwatch, expressed
    182    * in milliseconds, with any fraction rounded down. This is identical to
    183    * {@code elapsed(TimeUnit.MILLISECONDS)}.
    184    *
    185    * @deprecated Use {@code stopwatch.elapsed(MILLISECONDS)} instead. This
    186    *     method is scheduled to be removed in Guava release 16.0.
    187    */
    188   @Deprecated
    189   public long elapsedMillis() {
    190     return elapsed(MILLISECONDS);
    191   }
    192 
    193   /**
    194    * Returns a string representation of the current elapsed time.
    195    */
    196   @GwtIncompatible("String.format()")
    197   @Override public String toString() {
    198     return toString(4);
    199   }
    200 
    201   /**
    202    * Returns a string representation of the current elapsed time, choosing an
    203    * appropriate unit and using the specified number of significant figures.
    204    * For example, at the instant when {@code elapsed(NANOSECONDS)} would
    205    * return {1234567}, {@code toString(4)} returns {@code "1.235 ms"}.
    206    *
    207    * @deprecated Use {@link #toString()} instead. This method is scheduled
    208    *     to be removed in Guava release 15.0.
    209    */
    210   @Deprecated
    211   @GwtIncompatible("String.format()")
    212   public String toString(int significantDigits) {
    213     long nanos = elapsedNanos();
    214 
    215     TimeUnit unit = chooseUnit(nanos);
    216     double value = (double) nanos / NANOSECONDS.convert(1, unit);
    217 
    218     // Too bad this functionality is not exposed as a regular method call
    219     return String.format("%." + significantDigits + "g %s",
    220         value, abbreviate(unit));
    221   }
    222 
    223   private static TimeUnit chooseUnit(long nanos) {
    224     if (SECONDS.convert(nanos, NANOSECONDS) > 0) {
    225       return SECONDS;
    226     }
    227     if (MILLISECONDS.convert(nanos, NANOSECONDS) > 0) {
    228       return MILLISECONDS;
    229     }
    230     if (MICROSECONDS.convert(nanos, NANOSECONDS) > 0) {
    231       return MICROSECONDS;
    232     }
    233     return NANOSECONDS;
    234   }
    235 
    236   private static String abbreviate(TimeUnit unit) {
    237     switch (unit) {
    238       case NANOSECONDS:
    239         return "ns";
    240       case MICROSECONDS:
    241         return "u03bcs"; // 渭s
    242       case MILLISECONDS:
    243         return "ms";
    244       case SECONDS:
    245         return "s";
    246       default:
    247         throw new AssertionError();
    248     }
    249   }
    250 }
    google stopwatch source code

      

  • 相关阅读:
    java学习笔记(day21)
    linux软件管理之rpm管理rpm包
    linux软件管理之yum管理rpm包
    linux软件管理之概述
    linux存储管理之磁盘配额
    linux存储管理之文件系统
    linux存储管理之mount挂载
    linux存储管理之磁盘阵列
    linux文件管理之链接文件
    linux存储管理之自动挂在
  • 原文地址:https://www.cnblogs.com/lzxianren/p/4761537.html
Copyright © 2011-2022 走看看