如果在黑莓代码或任何其他编程语言中保留System.out.println(...)调用,是否会产生任何影响?
如果删除它们,可能会减少编译时间,但是否有任何特定的其他原因需要将它们删除?
如果在黑莓代码或任何其他编程语言中保留System.out.println(...)调用,是否会产生任何影响?
如果删除它们,可能会减少编译时间,但是否有任何特定的其他原因需要将它们删除?
在Blackberry上使用System.out.println()
之前,您需要知道以下几点:
一旦您将某些内容打印到标准输出,任何安装了您的应用程序的人都可以看到它们。他们只需要将设备连接到模拟器并在调试模式下运行即可。因此,请确保不要在发布的应用程序中打印出任何敏感信息,例如密码、类名等。
System.out.println()
本身所产生的性能开销是很小的,特别是当输出流未连接到任何东西时(即设备未连接且未处于调试模式)。
我个人更喜欢使用Blackberry预处理器,在发布之前禁用所有日志记录。出于这个原因,我定义了一个日志记录指令LOGGING
,然后在我的代码中:
//#ifdef LOGGING
System.out.println("LOGGING is enabled");
//#endif
了解如何在Blackberry Eclipse插件中使用预处理器,请参见此文档。
创建你自己的方法,例如:
public static void consoleMessage(String msg){
if(DEBUG_FLAG){
System.out.println(msg);
}
}
然后在您的代码中只使用这个。这将为您节省更改所有行的时间。
DEBUG_FLAG
是static final
,那么编译器很有可能会优化整个调用。仍然会有构造msg
的成本,如果您执行类似于consoleMessage(doSomethingSlow())
这样的操作,则可能会很大,但在大多数情况下可能不是问题。 - Cameron Skinner我更喜欢使用标志来禁用sysout。如果您在循环中经常使用它们,例如在循环中,那么sysout的速度会非常慢。
运行时可能会减少,因为语句实际上是被执行的 - 即使用户在屏幕上看不到输出。如果您使用了很多这些(例如在紧密循环中)或者您传递给它们具有昂贵的toString()方法的对象,则无用的输出可能会减慢您的速度。
此外,如果您将String
作为参数传递,那么它们将占用一些字节码和内存空间。您拥有173 PB RAM的超级计算机可能不在意,但是存在资源受限的系统(例如移动设备)。
如果您不打算将输出用于调试等方面,那么最好将其删除。您的程序只能以输出行的速度运行,因此理论上您拥有的 system.out 行数越少,进程就会越快。
希望这可以帮到您。
你应该能够使用 Ant 将这些行从你的源代码预处理掉。(确保它们中没有任何副作用!)
我不确定黑莓设备的情况,但如果你的程序要写入一个未知的设备(即你不确定标准输出去哪里),那么你的应用程序可能会偶尔/间歇性地/莫名其妙地在尝试写入时短暂地阻塞。
通常情况下,保留System.out
语句并不是什么坏事。用户可能能够看到它们,因此在生产环境中并不总是好看。更好的做法是使用日志框架,例如java.util.logging
或log4j
。这些可以配置为将输出转储到控制台、文件、数据库、Web服务等。
请记住,仅因为您看不到输出并不意味着在运行时没有工作正在进行。JVM仍然必须创建一个字符串以传递给system.out(或日志语句),对于大型/复杂对象(如集合),这可能需要相当多的内存/CPU。
Sysout语句访问一个同步的共享资源,这会导致使用它的线程之间的同步。如果没有其他代码强制执行同步,这可以防止多线程程序中的内存一致性错误。当删除sysout语句时,代码中任何现有的内存一致性错误可能会首次出现。
关于此效果的示例,请参见:循环在没有打印语句的情况下看不到更改的值。