Heim >Java >javaLernprogramm >Wie der Spring Boot-Quellcode StopWatch implementiert, um den Zeitverbrauch elegant zu zählen
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????.
Verwenden Sie Beyond Compare zum VergleichenWenn Sie Beyond Compare zum Vergleichen verwenden, können wir auch feststellen, dass die Codes bis auf einen chinesischen Kommentar und einen englischen Kommentar fast gleich sind. Die setKeepTaskList-Methode ist ganz anders.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.
Durch die Analyse des Quellcodes der Stop-Methode von StopWatch: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; }Tatsächlich können wir feststellen, dass StopWatch intern über System.nanoTime() gesteuert wird, was sich im Wesentlichen nicht wesentlich von System.currentTimeMillis() unterscheidet. nanoTime ist detaillierter als currentTimeMillis. Ersteres wird in Nanosekunden und letzteres in Millisekunden angegeben.
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.
Nachdem Sie das gesehen haben, wird Ihnen plötzlich klar, dass StopWatch nur System.currentTimeMillis() ist, das von einer Kleidungsschicht bedeckt ist? Aber das Wunderbare ist, dass dieser Mantel schön und elegant genug ist. StopWatch kann den Namen jeder Unteraufgabe aufzeichnen und die Ergebnisse in einem Format ausdrucken, das insbesondere für Multitask-Statistiken benutzerfreundlicher ist. Natürlich ist neben der Wahl von StopWatch of Spring und Hutool auch StopWatch of Apache commons-lang3 eine gute Option, die flexibler und veränderbarer ist.StopWatch sw = StopWatch.createStarted(); Thread.sleep(1000); System.out.printf("耗时:%dms.\n", sw.getTime());Die anderen beiden erstellen StopWatch-Objekte über new. Commons-lang3 kann auch über createStarted (erstellen und sofort starten) und create (erstellen) abgeschlossen werden. Sie können auch die Suspend-Methode aufrufen, um die Zeitmessung anzuhalten, die Resume-Methode, um die Zeitmessung fortzusetzen, und die Reset-Methode, um die Zeitmessung neu zu starten.
// 暂停计时 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!