Leistung in Scala-Logging-Bibliotheken Call-by-Value vs Call-by-Name

8

Ich habe mir in letzter Zeit die verschiedenen Scalabanking-Bibliotheken angeschaut, und die große Mehrheit von ihnen implementiert ihre Protokollierungsfunktionen als

%Vor%

Wenn die Debug-Protokollierung deaktiviert ist, wird die Anweisung nicht ausgeführt. Ich bin jedoch gerade auf logula gestoßen, was ausdrücklich zu den Vorteilen zählt

  

Im Gegensatz zu vielen anderen Scala-Protokollbibliotheken wird Logula nicht verwendet   Semantik mit pass-by-name (z.B. f: = & gt; A) für ihre Protokollierungsanweisungen,   Das bedeutet zwei Dinge:

     
  • Der Scala-Compiler muss keine einmaligen Abschlussobjekte für jede Protokollierungsanweisung erstellen. Dies sollte die Menge an Müll reduzieren   Sammeldruck.
  •   

Was mir wirklich einen Sinn macht. Meine Frage ist also, gibt es irgendwelche realen Leistungsvergleiche / Daten, die die beiden Ansätze vergleichen? Idealerweise etwas von einem Live-Projekt gegen erfundene Benchmarks?

    
Falmarri 31.07.2012, 16:37
quelle

2 Antworten

8

Was schneller ist, hängt vollständig von Anwendungsfällen ab. Wenn Sie statische Zeichenfolgen protokollieren, ist es schneller, diese konstante Zeichenfolge einfach zu übergeben und zu ignorieren. Andernfalls müssen Sie beim Erstellen von Zeichenfolgen mindestens ein Objekt erstellen. Funktionsobjekte sind winzig und billig - Sie sollten besser eine davon als die Zeichenfolge erstellen, wenn Sie sie ignorieren.

Persönlich denke ich, dass diese Art von Verständnis der Kompromisse der ersten Prinzipien noch wertvoller ist als eine Fallstudie einer bestimmten Anwendung, die das eine oder andere verwendet haben könnte, weil Sie verstehen, warum Sie eines oder das andere wählen würden andere (und Sie werden immer noch Ihre eigene Anwendung benchmarken wollen).

(Hinweis: Wie teuer die Objekterstellung ist, hängt davon ab, wie stark der Garbage Collector betroffen ist; im Allgemeinen können kurzlebige Objekte mit einer Geschwindigkeit von etwa 10 8 erstellt und entsorgt werden pro Sekunde, was außer in engen inneren Schleifen keine Rolle spielt. Wenn Sie Logging-Anweisungen in enge innere Schleifen schreiben, denke ich, dass etwas nicht stimmt. Dafür sollten Sie Unit-Tests schreiben.)

    
Rex Kerr 31.07.2012 16:46
quelle
3

Ich werde ein wenig aussteigen und sagen, dass philosophische Diskussionen über Kompromisse nützlicher sind, wenn es einen interessanten Kompromiss gibt, der nicht hier sein soll.

%Vor%

Zählt die Closure-Objekte.

    
extempore 01.08.2012 05:44
quelle