Log.i()函数会影响Android应用程序的性能吗?

6

我是一个老派的开发者(好吧,我只有20岁,不算老派,只是喜欢打印出来看而不是使用逐步调试器:P),我在Android应用程序中有很多Log.i()调用。我想知道这是否会对应用程序的性能产生影响?

我知道我应该使用逐步调试器,只是调试多个线程可能有点麻烦。

谢谢你的帮助!

5个回答

7

我认为日志不会影响应用程序的性能,因为在发布应用程序时,您可以通过在Android清单中设置debuggable来关闭它:

<application android:icon="@drawable/icon" 
        android:label="@string/app_name"
        android:debuggable="false">

5
在清单文件中设置“debuggable”将影响 Log.d 语句的输出,但 Log.i 和 Log.e 仍将存在。如果应用程序中有太多这些语句,则会影响其性能。请注意,此处不提供解释。 - Omar Rehman

4

我自己正在研究Android编程,但从目前看来,我认为Android日志记录遭受了大多数Java日志框架所遭受的问题(值得注意的例外是SLF4J),即:

  • 日志记录会影响性能,因为:
    1. 它意味着额外的方法调用。(对于99%的应用程序不是问题)。
    2. 它通常意味着字符串组合工作(有很大的影响)
    3. 它涉及额外的IO(有很大的影响)

开发人员通常通过添加保护块来处理这个问题

if (log.isDebugEnabled()) {
   log.debug("...");
}

我认为Android SDK也可以做到这一点。它涵盖了#2和#3,但仍然会使您的发布代码包含未使用的日志记录代码。当然,假设您永远不想在发布情况下启用调试日志记录。

顺便说一下,SFL4J不需要保护块,因为它使用类似于C的方法调用,延迟字符串组合直到实际需要。不幸的是,Android似乎没有走这条路。iOS也没有这个问题,因为它有一个预编译器。这是我经常希望Java保留的东西。

无论如何,我不建议删除日志记录以支持调试器。在我看来,它们有两个不同的目的。如果正确地完成,我发现日志记录非常有用,可以理解应用程序的流程。我经常通过查看日志找到问题,而在调试器中找不到。例如,在多个类(特别是UI类)中执行不必要的代码、不导致实际错误的奇怪数据问题等。在这些情况下,使用调试器就像用勺子铺混凝土。另一方面,调试器非常适合分析由日志记录突出显示的问题的细节。

因此,在我的代码中,我倾向于有相当数量的日志记录,旨在以类似英语的方式告诉我应用程序正在做什么,这样我可以轻松阅读并理解正在发生的事情。但是我非常严格地保持最低级别的水平。也就是说,除非是您想在发布模式下查看的内容,否则不要在信息级别记录日志。我发现许多开发人员往往会打破这一点。
更新:刚刚阅读了在发布之前删除所有调试日志调用:有工具可以做到这一点吗?,其中讨论了如何使用ProGuard从发布代码中去除日志记录。绝妙的主意,这意味着您可以不必在日志记录上使用保护块,并尽可能多地放置,但仍然可以确保您的发布代码速度快。

2

如果您切换到Log.d,则可以调试应用程序,并在构建发布版本时,不会编译或执行任何这些调用。


我需要稍微编辑一下,你的Log.d函数当然仍然是预编译到dalvik虚拟机中的;但是,它永远不会完全执行日志功能。你仍然执行方法调用,但这个调用的影响很小,特别是在2.2的缓存功能下。 - bfly2000

1

0

答案是肯定的和否定的。

这取决于您有多少个Log调用,而且由于您谈论的是步进式调试,我猜想您现在不担心发布代码(当然会删除过多的日志记录)。

我曾经使用过过多的日志记录来追踪我的调试代码中特别难以捉摸的问题,直到我找到问题后才删除了该日志记录。

简而言之,在开发中尽可能多地记录日志,但不要让用户遭受其影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接