System.out.println()是否会影响代码效率?

时间:2013-05-28 05:53:02

标签: java

我曾经写过&使用system.out.println()开发代码。它通常可以帮助我跟踪价值和问题的来源。在开发应用程序之后,我不会删除system.out.println(),因为在用户发现任何问题后它可能会有用,它会回复给我们,这样可以很容易地跟踪出错的地方。但我的一位上级建议从代码中删除system.out.println(),因为它会影响代码效率级别。这是对的吗?

从我的角度来看,System.out.print()几乎不占用内存字节,因此开发人员不应该使用多少system.out.println ??

提前致谢。

9 个答案:

答案 0 :(得分:18)

System.out实现在输出流中包含 synchronized 块。

来自PrintStream.java

      /**
        * Prints a String and then terminate the line.  This method behaves as
        * though it invokes <code>{@link #print(String)}</code> and then
        * <code>{@link #println()}</code>.
        *
        * @param x  The <code>String</code> to be printed.
        */

       public void println(String x) {
           synchronized (this) {
               print(x);
               newLine();
           }
      }

使用System.out.println会使整个项目几乎单线程运行,因为所有线程都会等待同步锁定,并使您的应用程序开始爬行。

这意味着你的上司是对的。

或者,使用log4j之类的日志框架代替。您仍然可以通过appender配置中的微小更改将log4j配置为仍然输出到System.out.println。

答案 1 :(得分:3)

您可以使用记录器来解决问题。

在开发代码时指定日志记录级别,您可以设置生产中的日志记录级别。

级别列表:

DEBUG Level

INFO Level

WARN Level

ERROR Level

FATAL Level

Log4j是常用的,请看这里:

http://logging.apache.org/log4j/2.x/

关于使用println的缺点

反对的主要原因是println 减慢程序的速度。

答案 2 :(得分:2)

强烈建议使用SLF4J等日志框架。通过配置,您可以根据环境执行这些日志记录语句。

例如 - 开发人员的DEBUG级别 - 生产时的WARN,因此在生产中只记录关键的iformation。

答案 3 :(得分:2)

确实输出到控制台,特别是输出过多,会降低应用程序的性能。它也是更好的编程风格,不会给用户带来只有你可以使用的信息。相反,您应该使用Java的内置机制来处理意外事件,例如:异常和断言机制。您还可以选择将“详细”选项作为命令行参数。

答案 4 :(得分:2)

如果在多线程环境(甚至是Web应用程序)中广泛使用,

System.out.println可能会导致严重的性能问题。每个println调用都获取一个锁,以便控制台上显示的消息不会与其他消息混淆。

此外,在大多数情况下,控制台的输出会重定向到文件。因此,它会导致许多同步IO操作,从而导致性能下降。

答案 5 :(得分:2)

是的,必须最小化对System.out.println()的调用。这是因为打印到控制台是IO操作,IO需要相对长的时间才能完成。这就是为什么我们尽可能使用StringBuilder来连接我们想要在内存中打印的东西。汇集了我们想要在内存中打印的所有内容之后,这是您想要调用System.out.println()的时间。

调用System.out.println()对内存没有影响。

答案 6 :(得分:1)

维护日志文件而不是system.out.println是件好事。如果你使用这个,只有devolopers可以在控制台上看到。你看不到更多的消息。

但是你不能将它用于将来使用。如果你使用日志记录,你可以将消息保存到数据库或文件......等等。

答案 7 :(得分:1)

我相信你在这个背景下谈论Java,并且将说明针对system.out.println()的另一种方法。

System.out.print(); // Prints a string of characters only
System.out.println(); // Prints a string of character followed by a line break and that line break is the one which is taking up tons of space if I ain't wrong.

希望这有帮助。

答案 8 :(得分:1)

System.out.println放在最糟糕的做法上。尝试实现日志记录概念。 使用log4jlog4j2来保存系统日志。用于跟踪或调试代码。