【问题标题】:Does Log.i() affect performance on Android applications?Log.i() 会影响 Android 应用程序的性能吗?
【发布时间】:2011-04-14 00:13:33
【问题描述】:

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

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

感谢您的帮助!

【问题讨论】:

    标签: android debugging


    【解决方案1】:

    我认为Log不会影响应用程序的性能,因为在发布应用程序时,您在Android Manifest中通过设置debuggable将其关闭:

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

    【讨论】:

    • debuggable in Manifest 会影响 Log.d 语句,但 Log.i、Log.e 仍然存在,如果您的应用程序中这些语句过多,则会影响应用程序的性能。跨度>
    【解决方案2】:

    我自己仍在研究 Android 编码,但根据我目前所见,我认为 Android 日志记录与大多数 Java 日志记录框架所遭受的问题相同(值得注意的例外是 SLF4J),即:

    • 日志记录确实会影响性能,因为:
      1. 这意味着额外的方法调用。 (99% 的应用都不是问题)。
      2. 这通常意味着字符串组装工作(大影响)
      3. 它参与了额外的 IO(大影响)

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

    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 从发布代码中删除日志记录。好主意,这意味着您不必为日志记录而烦恼,可以随意添加,但仍然可以确保您的发布代码会很快。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我需要稍微编辑一下,你的Log.d函数当然还是预编译到dalvik vm中的;但是,它永远不会完全执行日志功能。您仍然执行方法调用,但此调用影响很小,尤其是使用 2.2 的缓存功能。
      【解决方案4】:

      是的,它确实有性能损失。检查这个:Log.d and impact on performance

      【讨论】:

        【解决方案5】:

        答案是肯定的和否定的。

        这取决于您有多少 Log 调用,并且当您谈论分步调试时,我猜您在此阶段并不担心发布代码(当您显然会删除过多的日志记录时)。

        我使用了过多的日志记录,以至于它溢出了 logcat,但只有在我试图在我的调试代码中追踪一个特别难以捉摸的问题时——当我追踪到问题时,该日志记录就被删除了。

        简而言之,在开发过程中尽可能多地登录,但不要强加给用户。

        【讨论】:

          猜你喜欢
          • 2019-06-19
          • 2022-08-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多