【问题标题】:Does System.out.println() effect the code efficiency ?System.out.println() 会影响代码效率吗?
【发布时间】:2013-05-28 05:53:02
【问题描述】:

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

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

提前致谢。

【问题讨论】:

  • 你应该使用 logger 而不是 syso 行
  • 还请注意,当您使用像 apache commons 这样的日志框架时,您应该在尝试记录串联字符串之前检查是否启用了日志级别。如果日志级别仅为 INFO,则调用 Logger.debug("x = " + 5) 会导致字符串连接(很重),而您尝试记录的消息并未真正被记录。

标签: java


【解决方案1】:

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 配置进行微小更改。

【讨论】:

  • 能否提供 System.out 实现的同步块的参考?谢谢!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    级别列表:

    DEBUG Level
    
    INFO Level
    
    WARN Level
    
    ERROR Level
    
    FATAL Level
    

    Log4j 是常用的一种,见这里:

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

    关于使用 println 的缺点:

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

    【讨论】:

    • 谢谢。是的,我知道,但为此我必须打开一个日志文件并查看。例如,在调试值时 system.out.print() 只需打印值。所以它比日志文件更方便.. 如果我使用更多的 s.o.p 有什么危害?这是我的主要目标?
    • println 会降低你的程序在生产中的速度
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

            我相信您是在这种情况下谈论 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.
            

            希望这会有所帮助。

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-07-01
                • 1970-01-01
                • 1970-01-01
                • 2011-11-10
                • 2012-05-29
                • 2013-02-17
                • 2020-03-25
                • 1970-01-01
                相关资源
                最近更新 更多