gpt4 book ai didi

java - PrintStream是有缓冲的,但是flush不会降低性能,而BufferedOutputStream会加速性能

转载 作者:行者123 更新时间:2023-11-30 02:37:29 24 4
gpt4 key购买 nike

我预计由于 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() 上将内部缓冲区刷新到底层流。 。因此,在前两个示例中,每个 write() 最终都会命中 FileOutputStream。在第三个场景中,您将获得实际缓冲,其中写入仅定期命中 FileOutputStream。

如果您使用自己的基础流而不是 FileOutputStream,您会发现前两种情况将导致对流的约 1,000,000 次写入调用,而最后一种情况将导致更少的调用(基于缓冲区大小) .

关于java - PrintStream是有缓冲的,但是flush不会降低性能,而BufferedOutputStream会加速性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42680857/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com