Gestern fragte mich ein Golfer, ob ich ihm erklären könnte, was die Annotation @SpringBootApplication bedeutet und wie Spring Boot funktioniert, also nahm ich ihn mit, um den Quellcode dieser Annotation und von SpringApplication zu durchsuchen. Er verstand sofort den Quellcode von die run()-Methode der Klasse.
Sagen Sie es mir nicht, der Prozess des Betrachtens des Quellcodes ist wirklich interessant. Nein, ich habe einen interessanten Punkt entdeckt.
public ConfigurableApplicationContext run(String... args) { StopWatch stopWatch = new StopWatch(); stopWatch.start(); ...... stopWatch.stop(); }
Spring Boot verwendet StopWatch, um den Zeitverbrauch zu messen, und normalerweise verwenden wir System.currentTimeMillis(), um den Zeitverbrauch zu messen, oder? Programmierung Meow???? Es gibt einen solchen Code im Open-Source-Projekt, wenn es um Aspekte der einheitlichen Protokollverarbeitung geht.
@Around("webLog()") public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable { long startTime = System.currentTimeMillis(); long endTime = System.currentTimeMillis(); webLog.setSpendTime((int) (endTime - startTime)); }
Im Vergleich dazu können wir feststellen, dass System.currentTimeMillis() von JDK nicht so prägnant und klar ist wie StopWatch von Spring.
Vor allem beim Multitasking ist StopWatch so einfach zu bedienen????!
// 创建一个 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());
Sehen Sie, ist das nicht ganz einfach?
Erstellen Sie zuerst ein neues StopWatch-Objekt
und beginnen Sie dann mit der Zeitmessung
, dann stoppen Sie, um die Zeitmessung zu stoppen
Ermitteln Sie schließlich den Zeitunterschied über sw.getLastTaskTimeMillis()
If Du Wenn Sie es in „System .currentTimeMillis( )“ ändern, müssen Sie zunächst mehrere lokale Variablen vom langen Typ deklarieren und dann die erste von der zweiten subtrahieren Wenn man unvorsichtig ist (besonders bei der CV-Methode), kann man das leicht falsch machen.
Neben der Ortszeit können Sie auch die Gesamtzeit über sw.getTotalTimeSeconds() abrufen.
Aufgabe 1 dauert 1002 ms.
Aufgabe 2 dauert 1105 ms.
Anzahl der Aufgaben: 2, Gesamtzeitaufwand: 2,107820109 s. Darüber hinaus bietet StopWatch auch eine sw.prettyPrint()-Methode zum Drucken schön formatierter Ergebnisse:
StopWatch „Der stille Wang Er ist dumm“: Laufzeit = 2108529351 ns
------------------------- ------- -------------ns % AufgabennameZusätzlich zu Spring bieten sowohl die Hutool-Toolbibliothek als auch das Apache-Common-Tool-Paket ihre eigene StopWatch.--------------------- ---------- -----------
1004338467 048 % Aufgabe 1
1104190884 052 % Aufgabe 2
Der Zeitaufwand, der Belegungsanteil und der Aufgabenname sind sehr klar.
Wenn wir uns den StopWatch-Quellcode in der Hutool-Toolbibliothek ansehen, können wir sehen, dass diese Klasse tatsächlich aus Springs StopWatch.java stammt und ihre Verwendung genau die gleiche ist.
Das zeigt, dass der Autor von hutool auch Spring’s StopWatch für gut geschrieben hält, hahaha????.
Das heißt, wenn Sie in Ihrem Projekt nicht den Spring-Familien-Bucket verwenden und nur das Hutool-Toolpaket verwenden, können Sie StopWatch von Hutool anstelle von System.currentTimeMillis() verwenden.
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; }
Beachten Sie, dass es sich bei beiden um native Methoden handelt, d. h. die Granularität des Werts hängt tatsächlich vom zugrunde liegenden Betriebssystem ab.
StopWatch sw = StopWatch.createStarted(); Thread.sleep(1000); System.out.printf("耗时:%dms.\n", sw.getTime());
// 暂停计时 sw.suspend(); System.out.printf("暂停耗时:%dms.\n", sw.getTime()); // 恢复计时 sw.resume(); System.out.printf("恢复耗时:%dms.\n", sw.getTime()); // 停止计时 sw.stop(); System.out.printf("总耗时:%dms.\n", sw.getTime()); // 重置计时 sw.reset(); // 开始计时 sw.start(); System.out.printf("重置耗时:%dms.\n", sw.getTime());
Das obige ist der detaillierte Inhalt vonWie der Spring Boot-Quellcode StopWatch implementiert, um den Zeitverbrauch elegant zu zählen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!