簡體   English   中英

scala日志庫中的性能按值調用vs按名稱調用

[英]performance in scala logging libraries call-by-value vs call-by-name

我最近一直在關注各種scala日志庫,其中絕大多數都實現了日志記錄功能

def debug(s: => String)

因此,如果關閉調試日志記錄,它將不會執行該語句。 但是,我剛剛遇到了logula ,它特別指出了它的一個好處

與許多Scala日志庫不同,Logula不會對其日志記錄語句使用按名稱傳遞語義(例如,f:=> A),這意味着兩件事:

  • Scala編譯器不必為每個日志記錄語句創建一次性閉包對象。 這應該減少垃圾收集壓力。

這實際上對我來說是完全合理的。 所以我的問題是,是否存在比較這兩種方法的真實世界性能基准/數據? 理想情況下,從現場項目到人為的基准測試?

哪個更快取決於用例。 如果您正在記錄靜態字符串,那么只需傳遞該常量字符串並忽略它就會更快。 否則,如果您正在創建字符串,則無論如何都必須創建至少一個對象。 函數對象很小且很便宜 - 如果你要忽略它,你最好創建其中一個而不是字符串。

就個人而言,我認為這種對權衡的第一原則理解甚至比對某個特定應用的案例研究更有價值,因為它可以讓你理解為什么你會選擇其中一個(和你仍然總是希望對自己的應用程序進行基准測試。

(注意:對象創建的成本有多大取決於垃圾收集器的影響程度;通常,可以以每秒10 8的速率創建和處理短期對象,這不應該是一個問題除了在緊密的內部循環中。如果你將日志語句放在緊密的內部循環中,我認為有些錯誤。你應該為此編寫單元測試。)

我會滔滔不絕地說,當有一些有趣的權衡要做時,關於權衡的哲學討論會更有用,也就是說,不是在這里。

class A {
  var debugging = true
  @inline final def debug(msg: => String) = if (debugging) println(msg)

  def f = { debug("I'm debugging!") ; 5 }
}
% scalac292 -optimise a.scala
% ls -l *.class
-rw-r--r--  1 paulp  staff  1503 Jul 31 22:40 A.class
%

計算閉包對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM