这可能是最好的 Android/Kotlin日志输出方法

原文转载自 「技术小黑屋」 (https://droidyue.com/blog/2019/11/24/smart-log-in-android-slash-kotlin/)

预计阅读时间 0 分钟(共 0 个字, 0 张图片, 0 个链接)

在编程调试和定位问题的时候,日志是一个最常用的工具。比如输出一些信息,确定执行轨迹。今天我们这里简单聊一聊打印日志的一些分析。

通常,我们进行日志输出的时候都会限定在debug包下执行,对于非debug包,我们就不输出日志。那么如果是非debug,不同的日志输出方式可能存在一定的性能问题,本文将通过几个版本来对比着方面的差异。

原始版

这可能是最原始的版本打印日志了,判断是否是debug,然后决定是否输出日志

1
2
3
4
5
6
7
8
9
fun debugLog(message: String?) {
    if (BuildConfig.DEBUG) {
        Log.d("debugLog", message)
    }
}

private fun testDebugLog() {
    debugLog("getProperties " + getProperties()?.joinToString())
}

上面的问题

不拼接的版本

既然拼接会导致一些问题,那么下面的版本采用(调用处)不拼接的形式

1
2
3
4
5
6
7
8
9
fun debugMessage(vararg args: Any?) {
    if (BuildConfig.DEBUG) {
        Log.d("debugMessage", args.joinToString())
    }
}

private fun testDebugMessage() {
    debugMessage("getProperties", getProperties())
}

相对最完美的版本

这个版本是相对最好的实现,规避了非Debug环境下的字符串拼接和具体求值的操作

1
2
3
4
5
6
7
8
9
10
11
inline fun smartMessage(lazyMessage: () -> Any?) {
    if (BuildConfig.DEBUG) {
        Log.d("smartMessage", lazyMessage().toString())
    }
}

private fun testSmartMessage() {
    smartMessage {
        "getProperties " + getProperties()
    }
}

如何巧妙地规避不必要的开销

当我们反编译Kotlin 代码 到 Java代码时,一切就清晰了。

1
2
3
4
5
6
7
8
9
10
private final void testSmartMessage() {
      int $i$f$smartMessage = false;
      if (BuildConfig.DEBUG) {
         String var3 = "smartMessage";
         int var2 = false;
         String var4 = "getProperties " + this.getProperties();
         Log.d(var3, String.valueOf(var4));
      }

}

注意

相关阅读

more_vert