如果保留在BlackBerry代码或任何其他编程语言中,System.out.println(...)调用是否会产生任何影响?
删除后,编译时间可能会缩短,但是有任何其他原因可以删除它们吗?
答案 0 :(得分:4)
在Blackberry上使用System.out.println()
之前,您需要了解一些事项:
将某些内容打印到标准输出后,任何在您的设备上安装了您的应用程序的人都可以看到它们。他们需要做的就是将设备连接到模拟器并以调试模式运行。因此,请确保您不会在已发布的应用程序中打印出任何敏感内容,例如密码,类名等。
System.out.println()
本身所产生的性能开销很小,尤其是当输出流未连接到任何东西时(即设备未连接且未处于调试模式)。
我自己更喜欢使用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.logging
或log4j
等日志框架。这些可以配置为将输出转储到控制台,文件,数据库,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