注释掉System.out.println

时间:2010-12-10 13:14:47

标签: java blackberry

如果保留在BlackBerry代码或任何其他编程语言中,System.out.println(...)调用是否会产生任何影响?

删除后,编译时间可能会缩短,但是有任何其他原因可以删除它们吗?

11 个答案:

答案 0 :(得分:4)

在Blackberry上使用System.out.println()之前,您需要了解一些事项:

  1. 将某些内容打印到标准输出后,任何在您的设备上安装了您的应用程序的人都可以看到它们。他们需要做的就是将设备连接到模拟器并以调试模式运行。因此,请确保您不会在已发布的应用程序中打印出任何敏感内容,例如密码,类名等。

  2. System.out.println()本身所产生的性能开销很小,尤其是当输出流未连接到任何东西时(即设备未连接且未处于调试模式)。

  3. 我自己更喜欢使用Blackberry预处理器,以便在发布之前禁用所有日志。出于这个原因,我定义了一个日志记录指令LOGGING,然后在我的代码中定义:

    //#ifdef LOGGING
    System.out.println("LOGGING is enabled");
    //#endif
    

    有关如何在Blackberry Eclipse插件中使用预处理器的更多信息,请参阅this

答案 1 :(得分:1)

我更喜欢使用标志来禁用sysouts。如果你经常使用它们,那么Sysouts真的很慢,例如。在循环中。

答案 2 :(得分:1)

运行时也可能会减少,因为语句实际执行 - 即使用户没有在屏幕上看到输出。如果您正在使用大量这些(例如在紧密循环中)或者您使用昂贵的toString()方法向它们传递对象,那么无用的输出可能会减慢您的速度。

此外,如果您将String作为参数传递,那么这些将占用字节码和内存中的一些空间。你在拥有173 PB内存的机器上可能并不关心,但有资源有限的系统(如移动设备)。

答案 3 :(得分:1)

如果您不打算将输出用于调试等任何内容。然后最好把它拿出来。您的程序只能以可以输出的行的速度运行,因此理论上,system.out行越少,流程就越快。

希望这有帮助。

答案 4 :(得分:1)

您应该能够使用Ant从源代码中预处理这些行。 (确保它们都没有副作用!)

答案 5 :(得分:1)

我不是特别了解Blackberry,但如果您的程序正在写入未知设备(即您不确定标准输出的位置),您的应用可能会偶尔/偶尔/莫名其妙地阻止暂时在尝试写作。

答案 6 :(得分:1)

创建自己的方法,即:

public static void consoleMessage(String msg){
  if(DEBUG_FLAG){
    System.out.println(msg);
  }
}

然后在整个代码中使用此功能。它将为您节省更换所有线路的时间。

答案 7 :(得分:1)

使用类似Log4J的内容而不是系统输出打印语句,它为您提供了更大的灵活性

答案 8 :(得分:1)

保持System.out语句并不是一件坏事。用户可能能够看到它们,因此它在生产环境中看起来并不总是很好。更好的想法是使用java.util.logginglog4j等日志框架。这些可以配置为将输出转储到控制台,文件,数据库,Web服务......

请记住,只是因为您无法看到输出并不意味着在运行时没有完成任何工作。 JVM仍然需要创建一个String来传递给system.out(或一个日志语句),它可以为大型/复杂对象(如集合)占用相当多的内存/ CPU。

答案 9 :(得分:0)

Sysout语句访问同步的共享资源,这会在使用它的线程之间导致synchronization。如果没有其他代码强制执行同步,这可以防止多线程程序中的memory consistency错误。删除sysout语句后,代码中的任何现有内存一致性错误都可能首次出现。

有关此效果的示例,请参阅:Loop doesn't see changed value without a print statement

答案 10 :(得分:-4)

它不是一个对象,它没有附加任何内存,所以除了运行它并编译它之外不应该有任何影响。当然可读性也许lol