14

我曾经用system.out.println(). 它通常可以帮助我跟踪价值观以及问题出在哪里。在开发应用程序之后,我不会删除它,system.out.println()因为在用户发现任何问题后它可能会有所帮助,它会返回给我们,这使得跟踪哪里出错变得很容易。但是我的一位上司建议system.out.println()从代码中删除,因为它会影响代码的效率水平。它是否正确?

从我的角度来看,System.out.print()几乎不会占用内存,所以开发人员不应该使用太多是真的system.out.println吗?

提前致谢。

4

9 回答 9

19

System.out 实现在输出流上包含一个同步块。

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。您仍然可以将 log4j 配置为仍然输出到 System.out.println,只需对 appender 配置进行微小更改。

于 2013-05-28T05:58:42.083 回答
3

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

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

级别列表:

DEBUG Level

INFO Level

WARN Level

ERROR Level

FATAL Level

Log4j 是常用的一种,请参见此处:

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

关于使用 println的缺点:

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

于 2013-05-28T05:55:36.790 回答
3

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

例如 - 开发人员上的调试级别 - 生产上的警告,因此只有关键信息才会记录在生产中。

于 2013-05-28T05:56:46.110 回答
2

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

于 2013-05-28T05:59:58.783 回答
2

如果在多线程环境(甚至 Web 应用程序)中广泛使用 System.out.println 可能会导致严重的性能问题。每个 println 调用都会获取一个锁,这样控制台上显示的消息就不会与其他消息混在一起。

同样在大多数情况下,控制台的输出被重定向到一个文件。因此它会引发大量可能导致性能下降的同步 IO 操作。

于 2013-05-28T06:00:09.133 回答
2

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

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

于 2013-05-28T06:00:10.043 回答
1

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

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

于 2013-05-28T05:54:54.430 回答
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.

希望这可以帮助。

于 2013-05-28T05:57:11.060 回答
1

System.out.println它的最糟糕的做法。尝试实现日志记录的概念。使用log4jORlog4j2来维护系统的日志。用于跟踪或调试代码。

于 2013-05-28T05:58:41.807 回答