注释掉System.out.println

4

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

如果删除它们,可能会减少编译时间,但是否有任何特定的其他原因需要将它们删除?

11个回答

4

在Blackberry上使用System.out.println()之前,您需要知道以下几点:

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

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

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

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

了解如何在Blackberry Eclipse插件中使用预处理器,请参见此文档


1
最好将其封装在一个方法中 :) 调用方法很简单,但是每次都要键入 ifdef 很麻烦。 - drubin

1

创建你自己的方法,例如:

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

然后在您的代码中只使用这个。这将为您节省更改所有行的时间。


1
但是,你仍然会有一个方法调用,我不知道在黑莓 JVM 上这个的开销有多大。 - Goran Jovic
方法调用应该非常便宜(除非JVM完全失灵)。如果DEBUG_FLAGstatic final,那么编译器很有可能会优化整个调用。仍然会有构造msg的成本,如果您执行类似于consoleMessage(doSomethingSlow())这样的操作,则可能会很大,但在大多数情况下可能不是问题。 - Cameron Skinner

1

我更喜欢使用标志来禁用sysout。如果您在循环中经常使用它们,例如在循环中,那么sysout的速度会非常慢。


1

运行时可能会减少,因为语句实际上是被执行的 - 即使用户在屏幕上看不到输出。如果您使用了很多这些(例如在紧密循环中)或者您传递给它们具有昂贵的toString()方法的对象,则无用的输出可能会减慢您的速度。

此外,如果您将String作为参数传递,那么它们将占用一些字节码和内存空间。您拥有173 PB RAM的超级计算机可能不在意,但是存在资源受限的系统(例如移动设备)。


1

如果您不打算将输出用于调试等方面,那么最好将其删除。您的程序只能以输出行的速度运行,因此理论上您拥有的 system.out 行数越少,进程就会越快。

希望这可以帮到您。


1

你应该能够使用 Ant 将这些行从你的源代码预处理掉。(确保它们中没有任何副作用!)


1

我不确定黑莓设备的情况,但如果你的程序要写入一个未知的设备(即你不确定标准输出去哪里),那么你的应用程序可能会偶尔/间歇性地/莫名其妙地在尝试写入时短暂地阻塞。


1
使用类似 Log4J 的东西代替 System out 打印语句,它会给你更多的灵活性。

1

通常情况下,保留System.out语句并不是什么坏事。用户可能能够看到它们,因此在生产环境中并不总是好看。更好的做法是使用日志框架,例如java.util.logginglog4j。这些可以配置为将输出转储到控制台、文件、数据库、Web服务等。

请记住,仅因为您看不到输出并不意味着在运行时没有工作正在进行。JVM仍然必须创建一个字符串以传递给system.out(或日志语句),对于大型/复杂对象(如集合),这可能需要相当多的内存/CPU。


0

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