Mic*_*dan 8 java performance outputstream performance-testing
我已经看到了这个问题,它有点类似.我想知道它是否真的是影响我的应用程序性能的一个重要因素.这是我的情景.
我有这个Java webapp,它可以从电子表格上传数千个数据,每个行从上到下读取.我正在使用System.out.println()在服务器端显示应用程序当前正在读取的行.
- 我知道创建一个日志文件.实际上,我正在创建一个日志文件,同时在服务器的提示符下显示日志.
有没有其他方法在提示符上打印当前数据?
Ren*_*der 10
我最近测试(阅读和)编写大型(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();
Run Code Online (Sandbox Code Playgroud)
实际上差不多快了250%
System.out.println(yourString);
Run Code Online (Sandbox Code Playgroud)
我的测试程序首先读取了大约1GB的数据,稍加处理并以稍微不同的格式输出.
测试结果(在Macbook Pro上,使用相同磁盘读取和写入SSD):
我尝试使用256-10k之间的多个缓冲区,但这似乎并不重要.
因此,请记住,如果您使用Java创建unix命令行工具,其中输出将被定向或传送到其他位置,请不要直接使用System.out!
System.out.println()
Run Code Online (Sandbox Code Playgroud)
是同步的.
public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
Run Code Online (Sandbox Code Playgroud)
如果多个线程写入它,它的性能将受到影响.
小智 8
它可能会对您的应用程序性能产生影响.大小取决于您运行的硬件类型和主机上的负载.
这可以转化为绩效的一些要点:
- >像Rocket boy所说,println是同步的,这意味着你将在对象头上锁定开销,并可能导致线程瓶颈,具体取决于你的设计.
- >在控制台上打印需要内核时间,内核时间意味着cpu不会在用户模式下运行,这基本上意味着你的cpu将忙于执行内核代码而不是你的应用程序代码.
- >如果您已经记录了这个,这意味着I/O需要额外的内核时间,如果您的平台不支持异步I/O,这意味着您的cpu可能会在繁忙的等待时停止运行.
您实际上可以尝试对此进行基准测试并自行验证.
有很多方法可以解决这个问题,比如拥有一个非常快的I/O,一个专用的大机器,如果你的应用程序设计在这个控制台打印上没有多线程,那么你的JVM选项会有偏向锁定.
就像性能上的一切一样,这一切都取决于您的硬件和优先级.
| 归档时间: |
|
| 查看次数: |
10478 次 |
| 最近记录: |