Java – System.out对性能的影响

我已经看到了这个问题 ,它有点类似。 我想知道它是否真的是影响我的应用程序性能的一个重要因素。 这是我的情景。

我有这个Java Web应用程序可以从电子表格上传数千个数据,每个行从上到下读取。 我正在使用System.out.println()在服务器端显示应用程序当前正在读取的行。

– 我知道创建一个日志文件。 实际上,我正在创建一个日志文件,同时在服务器的提示符下显示日志。
是否还有其他方法可以在提示符下打印当前数据?

它会对您的应用程序性能产生影响。 幅度将根据您运行的硬件类型和主机上的负载而有所不同。

这可以转化为绩效的一些要点:

– >像Rocket boy所说的那样,println是同步的,这意味着你会在对象头上锁定开销,并可能导致线程瓶颈,具体取决于你的设计。

– >在控制台上打印需要内核时间,内核时间意味着cpu不会在用户模式下运行,这基本上意味着你的cpu将忙于执行内核代码而不是你的应用程序代码。

– >如果您已经记录了这个,这意味着I / O需要额外的内核时间,如果您的平台不支持异步I / O,这意味着您的cpu可能会在繁忙的等待时停止运行。

您实际上可以尝试对此进行基准测试并自行validation。

有很多方法可以解决这个问题,例如,如果您的应用程序设计不会在控制台打印上进行multithreading处理,那么可能会有非常快的I / O,可能需要专用的大型机器以及对JVM选项的偏向锁定。

就像性能上的一切一样,这一切都取决于您的硬件和优先级。

我最近测试(阅读和)编写大型(1-1.5gb)文本文件,我发现:

 PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(java.io.FileDescriptor.out), "UTF-8"), 512)); out.println(yourString); //... out.flush(); 

实际上比…快近250%

 System.out.println(yourString); 

我的测试程序首先读取了大约1GB的数据,稍微处理了一下并以稍微不同的格式输出。

测试结果(在Macbook Pro上,使用相同磁盘读取和写入SSD):

  • data-output-to-system-out> output.txt => 1min32sec
  • data- write -to-file-in-java => 37秒
  • data-written-to-buffered-writer-stdout> output.txt => 36sec

我尝试使用256-10k之间的多个缓冲区,但这似乎并不重要。

因此,请记住,如果您使用Java创建unix命令行工具,其中输出将被定向或传送到其他位置,请不要直接使用System.out!

 System.out.println() 

是同步的。

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

如果多个线程写入它,它的性能将受到影响。

是的,它会对性能产生巨大影响。 如果你想要一个可量化的数字,那么就有很多软件和/或测量你自己的代码性能的方法。

与大多数慢速操作相比,System.out.println非常慢。 这是因为它比其他IO操作在机器上放置了更多的工作(并且它是单线程的)

我建议你把输出写到一个文件并tail这个文件的输出。 这样,输出仍然会很慢,但它不会减慢您的Web服务。