4
A
回答
-1
如果你想要的代碼僅是執行當某些條件成立,則可以使用一個標準,如果塊:
if (SystemProperties.get("debug.mode").exists(_ == "true") {
println("Debugging!")
}
如果您擔心無論出於何種原因,該聲明不應該連出現在編譯後的輸出中,那麼你可以使用帶有編譯時常量表達式的if塊。在這些情況下,javac/scalac會正確地推斷出該條件永遠不會成立,所以甚至不包括該塊的字節碼。 (當然你需要修改生成的常數「真」拉的調試版本,而「假」爲督促建立。)
object Constants {
final val DEBUG = false
}
// ...
if (Constants.DEBUG) {
println("Debugging!")
}
+4
'最終val DEBUG'或它不是編譯時常量。 –
6
一個ç預處理程序的等價形式的#ifdef是一個斯卡拉宏:
package app.macros.log
import scala.language.experimental.macros
import reflect.macros.Context
object SimpleMacroLogger {
private val on = true
def info(msg: String): Unit = macro info_impl
def info_impl(c: Context)(msg: c.Expr[String]): c.Expr[Unit] = {
import c.universe._
if (on) {
reify {
println(msg.splice)
}
} else {
reify {
// Nothing
}
}
}
}
與
import app.macros.log.{SimpleMacroLogger => log}
object SimpleMacroLoggerDemo extends App {
log.info("Hello")
}
使用它更復雜的代碼,但它的用法是優越的:沒有必要圍繞#ifdef/#endif等等。所以它不會混亂你的代碼。
如果您將設置爲至false,宏將完全刪除日誌記錄。
reify中的任何內容都會進入結果字節代碼 其他代碼運行在編譯時間。如果(上)...,這特別適用於。
7
傳統的習語是@elidable。
的scaladoc涵蓋你的常規使用情況:
http://www.scala-lang.org/api/current/scala/annotation/elidable.html
[調試日誌斯卡拉在不影響性能(的相關問題
- 1. Javascript代碼僅在調試時運行
- 2. 斯卡拉,調用代碼
- 3. 解釋這行代碼在斯卡拉
- 4. 斯卡拉運行時間代碼編譯
- 5. 運行在斯卡拉
- 6. 獲得2.10斯卡拉在運行時
- 7. 斯卡拉Intellij運行測試套件
- 8. 斯卡拉IDE調試 「步入」 行爲
- 9. 火花斯卡拉運行
- 10. 同時運行斯卡拉FS2流
- 11. 無法運行在斯卡拉
- 12. 斯卡拉運行在JamVM上嗎
- 13. 嘗試在斯卡拉
- 14. 嘗試在斯卡拉
- 15. 調試運行時編譯代碼?
- 16. 強調了在斯卡拉
- 17. 調度在斯卡拉
- 18. 僅在使用Visual Studio進行調試時執行代碼
- 19. 斯卡拉代碼:反向操作
- 20. 斯卡拉Akka代碼提前終止
- 21. 斯卡拉優化這個代碼嗎?
- 22. 斯卡拉技術來組織代碼
- 23. 紅色代碼工具斯卡拉
- 24. spark flatmap - 斯卡拉java代碼
- 25. 斯卡拉代碼 - 我不明白
- 26. IntelliJ,分析斯卡拉代碼
- 27. 斯卡拉scopt代碼 - 地圖getorelse?
- 28. 混淆斯卡拉動態代碼段
- 29. 運行模板斯卡拉 - 並行similarproduct的單元測試
- 30. 斯卡拉在斯卡拉類
可能重複http://stackoverflow.com/questions/12044054/debug-log-對性能沒有影響) – senia
順便說一句,JVM和JIT通常在刪除死代碼方面做得非常好,因此很可能是簡單的'final val DEBUG = false'和'def log(str:String )= if(DEBUG)print(str)'應該足夠用於大多數情況。 –