【发布时间】:2011-04-14 00:13:33
【问题描述】:
我是一名老派开发人员(好吧,我 20 岁,我不是老派,我只是喜欢打印出来而不是使用逐步调试器 :P)而且我有很多Android 应用程序中的 Log.i() 调用。我想知道它是否会对应用的性能产生影响?
我知道我应该使用逐步调试器,只是调试多个线程可能有点麻烦。
感谢您的帮助!
【问题讨论】:
我是一名老派开发人员(好吧,我 20 岁,我不是老派,我只是喜欢打印出来而不是使用逐步调试器 :P)而且我有很多Android 应用程序中的 Log.i() 调用。我想知道它是否会对应用的性能产生影响?
我知道我应该使用逐步调试器,只是调试多个线程可能有点麻烦。
感谢您的帮助!
【问题讨论】:
我认为Log不会影响应用程序的性能,因为在发布应用程序时,您在Android Manifest中通过设置debuggable将其关闭:
<application android:icon="@drawable/icon"
android:label="@string/app_name"
android:debuggable="false">
【讨论】:
我自己仍在研究 Android 编码,但根据我目前所见,我认为 Android 日志记录与大多数 Java 日志记录框架所遭受的问题相同(值得注意的例外是 SLF4J),即:
开发人员通常通过添加保护块来处理这个问题
if (log.isDebugEnabled()) {
log.debug("...");
}
我认为 Android SDK 也可以做到这一点。它涵盖了 #2 和 #3,但仍然让您的发布代码包含未使用的日志记录代码。当然,假设您永远不想在发布情况下启用调试日志记录。
SFL4J 顺便说一句,不需要保护块,因为它使用类似 C 的方法调用来延迟字符串组装,直到它实际需要。不幸的是,Android 似乎并没有走这条路。 iOS 也没有这个问题,因为它有一个预编译器。我经常希望 Java 保留的东西。
无论如何,我不提倡删除日志记录以支持调试器。恕我直言,他们有两个不同的目的。我发现日志记录对于理解应用程序的流程非常有用(如果做得正确的话)。我经常通过查看在调试器中找不到的日志来发现问题。 IE。跨多个类(尤其是在 UI 类中)不必要的代码执行、不会导致实际错误的奇怪数据问题等。在这些情况下,使用调试器就像试图用勺子打混凝土一样。另一方面,调试器非常适合分析日志突出显示的问题的详细信息。
所以在我的代码中,我倾向于有大量的日志记录,旨在以类似英语的方式告诉我应用程序正在做什么,以便我可以轻松阅读并理解正在发生的事情。但我对保持尽可能低的水平相当严格。 IE。不要在信息级别记录东西,除非它是你想在发布模式下看到的东西。我发现很多开发人员都倾向于打破这一点。
更新:请阅读Remove all debug logging calls before publishing: are there tools to do this?,其中讨论了如何使用 ProGuard 从发布代码中删除日志记录。好主意,这意味着您不必为日志记录而烦恼,可以随意添加,但仍然可以确保您的发布代码会很快。
【讨论】:
如果您切换到 Log.d,那么您可以调试您的应用程序,并且在构建发布版本时,这些调用都不会被编译或执行。
【讨论】:
是的,它确实有性能损失。检查这个:Log.d and impact on performance
【讨论】:
答案是肯定的和否定的。
这取决于您有多少 Log 调用,并且当您谈论分步调试时,我猜您在此阶段并不担心发布代码(当您显然会删除过多的日志记录时)。
我使用了过多的日志记录,以至于它溢出了 logcat,但只有在我试图在我的调试代码中追踪一个特别难以捉摸的问题时——当我追踪到问题时,该日志记录就被删除了。
简而言之,在开发过程中尽可能多地登录,但不要强加给用户。
【讨论】: