我预计由于 PrintStream 是缓冲的,通过在每次 print() 之后添加刷新操作,速度性能应该会显着降低,但事实并非如此,如下面的代码片段所示。
此外,将 PrintStream 包裹在 BufferedOutputStream 周围可将性能提高 10 倍以上——这意味着 PrintStream 没有缓冲。
PrintStream 是否真的没有缓冲,或者它的缓冲区是否非常小,或者是否有其他解释为什么它不能提供缓冲流所期望的速度改进?
// PrintStream is buffered but takes 4228ms to complete
long start = System.currentTimeMillis();
try (PrintStream ps = new PrintStream(new FileOutputStream("1.txt") ))
{
for (int i = 0; i < 1_000_000; i++) {
ps.print(i + " ");
}
}
long stop = System.currentTimeMillis();
System.out.println(stop - start);
// PrintStream is buffered, but with auto-flush takes 4140ms to complete, no degraded speed implying flush did nothing
start = System.currentTimeMillis();
try (PrintStream os = new PrintStream(new FileOutputStream("1.txt") ))
{
for (int i = 0; i < 1_000_000; i++) {
os.print(i + " ");
os.flush();
}
}
stop = System.currentTimeMillis();
System.out.println(stop - start);
// PrintStream is buffered explicitly as a BufferedOutputStream and runs quickly: 202ms
start = System.currentTimeMillis();
try (PrintStream os = new PrintStream(new BufferedOutputStream(new FileOutputStream("1.txt")) ))
{
for (int i = 0; i < 1_000_000; i++) {
os.print(i + " ");
}
}
stop = System.currentTimeMillis();
System.out.println(stop - start);
虽然内部是“缓冲的”,但 write 方法会在每次写入时将内部缓冲区刷新到底层流write() http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/io/PrintStream.java#PrintStream.write%28java.lang.String%29。所以在你的前两个例子中,每个write()
最终命中的是FileOutputStream。在你的第三个场景中,你会得到actual缓冲,其中写入仅定期命中 FileOutputStream。
如果您使用自己的底层流而不是 FileOutputStream,您将看到前两种情况将导致对流的约 1,000,000 次写入调用,而最后一种情况将导致更少的调用(基于缓冲区大小)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)