当我在无控制台的GUI中运行程序时,Java是否运行System.out.println(...)
的任何代码? (我不会将程序输出重定向到任何地方)
实际上,我想知道System.out.println(...)
在单击jar文件运行时是否会影响程序性能。
考虑一下我每分钟打印数千行。
答案 0 :(得分:2)
Java处理调用的方式,如果你println
不是一个简单的字符串,那么可能会产生重大影响。
例如,
System.out.println("Iteration " + i);
创建一个StringBuilder,转换int
并复制一堆字符,然后它甚至可以确定System.out
后面没有任何内容。
答案 1 :(得分:1)
让我这样说吧。
如果你要从另一个程序执行你的程序,那么你就可以阅读程序的标准输出了,所以是的,即使没有什么是“倾听”,总会有东西发送到标准输出
根据经验,我们发现性能有所提高(在windows下),如果将stdout和stderr重定向到一个空流(消耗了流),但我们不仅仅是从我们的程序处理大量输出还有我们正在与之沟通的RMI服务器
答案 2 :(得分:0)
你正在写标准输出,如果没有该流的监听器那么就不用担心了。
答案 3 :(得分:0)
通过查看here,在检查某人是否正在收听流式传输之前,似乎在println
内完成了多个方法调用。
THEN:
为此,我希望使用Debug
方法创建一个print
类,因为我totally sure它不会影响性能:
public class Debug {
public static boolean debug = true;
public static int debLev = 5;
public static void print(String stringa){
if(debug)
System.out.println(stringa);
}
public static void print(String stringa, int level){
if(debug && level >= debLev){
System.out.println(stringa);
}
}
}
通过这种方式,您可以禁用打印,也可以按严重性过滤调试打印。
答案 4 :(得分:0)
理论上是,它可以影响性能,因为它实际上是方法调用,而方法调用使用微量的处理能力。然而,在现代计算机上它对一般性能没有影响。事实上,大多数现代程序/游戏都使用println来调试他们的程序,即使在真实版本中也是如此。如果它们是必需品,我会把它们留在那里。
答案 5 :(得分:0)
请参阅此处的文档:
http://docs.oracle.com/javase/6/docs/api/java/lang/System.html#out
即使外线上没有监听器,你仍然会有来自呼叫的开销。你的表现效果在很大程度上取决于你的表现。如果有一个倾听者,那么你将会看到更高的性能影响。
TLDR:编译器不会删除system.out.println调用,因此您会看到一些边际性能损失。