ホームページ  >  記事  >  Java  >  Spring Boot ソース コードで StopWatch を実装し、時間の消費をエレガントにカウントする方法

Spring Boot ソース コードで StopWatch を実装し、時間の消費をエレガントにカウントする方法

王林
王林転載
2023-05-11 14:13:131098ブラウズ

はじめに

昨日、ゴルファーから @SpringBootApplication アノテーションの意味と Spring Boot の動作について説明してもらえないかと尋ねられたので、このアノテーションを手に取ってもらいました。 SpringApplicationクラスのrun()メソッドのソースコードを見ると、すぐに理解できた。

言わないでください、ソースコードを見るプロセスは本当に興味深いです、いいえ、興味深い点を発見しました。

public ConfigurableApplicationContext run(String... args) {
	StopWatch stopWatch = new StopWatch();
	stopWatch.start();
	......
	stopWatch.stop();
}

Spring Boot では StopWatch を使用して消費時間をカウントしますが、通常は System.currentTimeMillis() を使用して消費時間をカウントします。プログラミングニャー??? 統合ログ処理の側面を扱う場合、オープンソースプロジェクトにはそのようなコードがあります。

@Around("webLog()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
    long startTime = System.currentTimeMillis();
    long endTime = System.currentTimeMillis();
    webLog.setSpendTime((int) (endTime - startTime));
}

比較すると、JDK が提供する System.currentTimeMillis() は Spring が提供する StopWatch ほど簡潔で明確ではないことがわかります。

StopWatch の使用

特にマルチタスクの場合、StopWatch はとても使いやすいです????!

// 创建一个 StopWatch 实例
StopWatch sw = new StopWatch("沉默王二是傻 X");
// 开始计时
sw.start("任务1");
Thread.sleep(1000);
// 停止计时
sw.stop();
System.out.printf("任务1耗时:%d%s.\n", sw.getLastTaskTimeMillis(), "ms");
sw.start("任务2");
Thread.sleep(1100);
sw.stop();
System.out.printf("任务2耗时:%d%s.\n", sw.getLastTaskTimeMillis(), "ms");
System.out.printf("任务数量:%s,总耗时:%ss.\n", sw.getTaskCount(), sw.getTotalTimeSeconds());

ほら、とても簡単ですね?

  • 最初に新しい StopWatch オブジェクトを作成します

  • 次にタイミングの開始を開始します

  • 次に停止してタイミングを停止

  • 最後に sw.getLastTaskTimeMillis() で時差を取得します

#これを System.currentTimeMillis() に変更すると、 die. 最初に宣言する必要があります long 型のローカル変数がいくつかあり、最初の変数から 2 番目の変数が減算され、2 番目の変数から 3 番目の変数が減算されます。 )、間違いを犯しやすいです。

現地時間に加えて、sw.getTotalTimeSeconds() を通じて合計時間を取得することもできます。

タスク 1 には 1002 ミリ秒かかります。
タスク 2 には 1105 ミリ秒かかります。
タスク数: 2、合計時間: 2.107820109 秒。

さらに、StopWatchまた、美しくフォーマットされた結果を出力する sw.prettyPrint() メソッドも提供します。

StopWatch 'Silent Wang Er is愚か': 実行時間 = 2108529351 ns
- ------- ---------------------------------------
ns % タスク名
------------------------------------------------- -
1004338467 048% タスク 1
1104190884 052% タスク 2

には、かかった時間、占有率、およびタスク名があり、非常に明確です。

Spring に加えて、hutool ツール ライブラリと Apache 共通ツール パッケージも独自の StopWatch を提供します。

Spring Boot ソース コードで StopWatch を実装し、時間の消費をエレガントにカウントする方法

hutool ツール ライブラリの StopWatch ソース コードを見ると、このクラスが実際には Spring の StopWatch.java から来ていることがわかり、その使用法はまったく同じです。

Spring Boot ソース コードで StopWatch を実装し、時間の消費をエレガントにカウントする方法

これは、hutool の作者も Spring の StopWatch がよく書かれていると考えていることを示しています、ははは???。

Beyond 比較を使用して比較する

Beyond 比較を使用して、1 つの中国語のコメントと 1 つの英語のコメントを除いて、コードがほぼ同じであることもわかります。 setKeepTaskList メソッドはまったく異なります。

Spring Boot ソース コードで StopWatch を実装し、時間の消費をエレガントにカウントする方法

つまり、プロジェクトで Spring Family Bucket を使用せず、hutool ツール パッケージのみを使用する場合は、System.currentTimeMillis の代わりに hutool の StopWatch を使用できます。 )。

StopWatch の stop メソッドのソース コードを分析すると:

public void stop() throws IllegalStateException {
	if (null == this.currentTaskName) {
		throw new IllegalStateException("Can't stop StopWatch: it's not running");
	}
	final long lastTime = System.nanoTime() - this.startTimeNanos;
	this.totalTimeNanos += lastTime;
	this.lastTaskInfo = new TaskInfo(this.currentTaskName, lastTime);
	if (null != this.taskList) {
		this.taskList.add(this.lastTaskInfo);
	}
	++this.taskCount;
	this.currentTaskName = null;
}

実際、StopWatch は System.nanoTime() を通じて内部的に時間が計測されており、これは基本的に System.currentTimeMillis と同じであることがわかります。 ()。 大きい。

nanoTime は currentTimeMillis よりも細かく、前者はナノ秒単位、後者はミリ秒単位です。

Spring Boot ソース コードで StopWatch を実装し、時間の消費をエレガントにカウントする方法

#両方ともネイティブ メソッドであることに注意してください。つまり、値の粒度は実際には基礎となるオペレーティング システムに依存します。

これを見た後、誰もが突然、StopWatch が単にコートを着た System.currentTimeMillis() であることに気づくかもしれません。

しかし、素晴らしいのは、このコートが十分に美しく、十分にエレガントであるということです。 StopWatch は、各サブタスクの名前を記録し、結果を、特にマルチタスクの統計にとって使いやすい形式で出力できます。

もちろん、Spring と hutool の StopWatch を選択することに加えて、より柔軟で変更可能な Apache commons-lang3 の StopWatch も良い選択肢です。

StopWatch sw = StopWatch.createStarted();
Thread.sleep(1000);
System.out.printf("耗时:%dms.\n", sw.getTime());

他の 2 つは new を使用して StopWatch オブジェクトを作成し、commons-lang3 は createStarted (作成してすぐに開始する) および create (作成) を使用して完了することもできます。

また、suspend メソッドを呼び出してタイミングを一時停止し、resume メソッドを呼び出してタイミングを再開し、reset メソッドを呼び出してタイミングを再開することもできます。

rree

以上がSpring Boot ソース コードで StopWatch を実装し、時間の消費をエレガントにカウントする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。