【问题标题】:Log.d and impact on performanceLog.d 和对性能的影响
【发布时间】:2011-04-15 22:53:13
【问题描述】:

我不完全确定我在文档中阅读的内容。是否可以留下一堆散落的 log.d 代码,或者我应该将它们注释掉,这样它们就不会影响我的应用程序的性能。

谢谢,

我有点困惑,因为如果您阅读有关日志对象 (documentation) 的信息,您会看到:

"详细程度的顺序,从少到多依次是ERROR、WARN、 信息、调试、详细。永远不应该将详细信息编译成 应用程序,除了在开发期间。调试日志编译在但 在运行时剥离。始终保留错误、警告和信息日志。 "

听起来几乎可以在其中留下调试消息,因为它们被“剥离”了。无论如何,感谢您的答案,我会在完成后将它们注释掉。一旦应用完成,我就不需要它们了。

谢谢

【问题讨论】:

  • 除了影响应用程序的性能外,它们还可能使其他人更难调试他们的东西。日志只有 64KB,因此每次添加日志消息时,都会有一些其他消息被推到顶部。

标签: android logging debugging


【解决方案1】:

一定要把它们注释掉。它们加起来很快,可能会显着降低您的应用速度,尤其是当您将它们置于循环中时。

【讨论】:

    【解决方案2】:

    日志对性能有影响,建议注释掉或者用条件语句记录。

    例如

    public class MyActivity extends Activity {
    // Debugging
     private static final String TAG = "MyApp";
     private static final boolean D = true;
     @Override
     public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(D) Log.e(TAG, "MyActivity.onCreate debug message");
     }
    

    然后在您发布发布版本时,只需将“D”更改为 false

    【讨论】:

    • 为什么不设置 debuggable=false 在应用程序中禁用调试:
    • @anticafe 因为例如,如果您在 Log 语句中进行连接,它仍然会运行(导致不必要的分配)。设置debuggable = false 仅确保它不会出现在日志中。这些方法仍然会被调用。
    • 更好的是,使用 Proguard 从代码中剥离所有日志。
    • 我认为最好的解决方案是使用第三方登录库,例如 Timber timber.io,这样您就可以根据它是处于生产模式还是调试模式来自定义您的应用日志行为。
    【解决方案3】:

    我的解决方案:

    【讨论】:

    • 迄今为止最好的解决方案恕我直言-根本不会污染代码:)
    • 但是你不能再次打开它们
    【解决方案4】:

    只需使用代码保护方法。

    if (Log.isLoggable(LOG_TAG, Log.DEBUG)) {
    Log.d(LOG_TAG, "Your log here");
    }
    

    【讨论】:

    • 即使这个检查也会影响性能。我刚刚运行 Traceview 并且 Log.isLoggable() 需要 5 毫秒 CPU 时间/调用和几乎 11 毫秒实时/调用。
    • 你是对的。但比将日志信息写入磁盘要好得多。并且可以通过服务器的配置来配置级别。
    • 这绝对比写入磁盘要好,但如果你试图以 60fps 的速度持续渲染帧,那就不好了。它在每帧 16.7 毫秒中占了很大一部分。
    【解决方案5】:

    是的 print、println、Log.d、Log.e 和所有类似的方法都会影响性能。

    解决方案

    创建一个名为C的类

    class C{
    public static String TAG="My_debug_tag";
    public static boolean isInTesting=true;
    
    public static void log(String tag, String msg){
     if(!isInTesting) return;
    
    Log.d(tag==null?TAG:tag, msg);
     
    }
    }
    

    并对所有日志使用这些方法,当您准备好生成最终 .apk/.aab 时,只需设置 isInTesting=false 以禁用此方法的所有日志。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-30
      • 2021-03-09
      • 2011-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多