Wie ist es möglich, Ihren Logging-Mechanismus zu verbessern, indem Sie nicht den Overhead von String-Verkettungen haben?
Betrachten Sie das folgende Beispiel:
%Vor% Die Protokollmethode log.fine(...)
protokolliert nichts, da die Protokollstufe auf INFO
gesetzt ist. Das Problem ist, dass die Methode getValue
trotzdem ausgewertet wird.
Und das ist ein großes Leistungsproblem in großen Anwendungen mit vielen Debug-Anweisungen.
So, wie man dieses Problem löst?
Seit Java8 ist es möglich, die neuen Lambda-Ausdrücke für dieses Szenario zu verwenden .
Hier ist ein modifiziertes Beispiel der Protokollierung:
LoggerTest.class
%Vor%LambdaLogger.class
%Vor%Mit dieser Modifikation können Sie die Leistung Ihrer Anwendungen erheblich verbessern, wenn Sie viele Protokollanweisungen haben, die nur für Debugging-Zwecke gedacht sind.
Natürlich können Sie einen beliebigen Logger verwenden. Dies ist nur ein Beispiel für java.util.Logger
.
@bobbel hat erklärt, wie es geht.
Ich möchte hinzufügen, dass dies zwar eine Leistungsverbesserung gegenüber Ihrem ursprünglichen Code darstellt, die klassische Vorgehensweise jedoch noch schneller ist:
%Vor%und nur marginal mehr wortreich.
Der Grund, warum es schneller ist, ist, dass die Lambda-Version den zusätzlichen Laufzeitaufwand zum Erstellen der aufrufbaren Instanz (Erfassungskosten) und eine zusätzliche Ebene von Methodenaufrufen aufweist.
Und schließlich gibt es das Problem, die LambdaLogger
Instanzen zu erstellen. @ bobbels Code zeigt an, dass dies mit einem Konstruktor gemacht wird, aber in Wirklichkeit müssen java.util.logging.Logger
Objekte durch eine Factory-Methode erstellt werden, um die Proliferation von Objekten zu vermeiden. Das bedeutet eine Menge zusätzlicher Infrastruktur (und Codeänderungen), damit dies mit einer benutzerdefinierten Unterklasse von Logger
funktioniert.
Verwenden Sie ein Format String
und ein Array von Supplier<String>
. Auf diese Weise werden keine toString
-Methoden aufgerufen, es sei denn, der Protokolldatensatz ist tatsächlich publizierbar. Auf diese Weise müssen Sie sich nicht mit hässlichen if
-Anweisungen über das Anmelden von Anwendungscode herumschlagen.