gpt4 book ai didi

Java 的 FilterOutputStream 增加了性能损失

转载 作者:行者123 更新时间:2023-11-30 06:05:00 26 4
gpt4 key购买 nike

我有一段代码将输出流拆分到两个目的地。他们都去一个文件,但第二个目的地将通过过滤器。我试图弄清楚为什么简单地包装 FilterOutputStream 而不覆盖任何方法会增加巨大的性能损失。

我创建了一个 358 兆字节的文件:

dd if=/dev/zero of=dummyfile.txt count=700000 bs=512

针对它运行这段代码:

private OutputStream getFilteredStream(OutputStream out1, OutputStream out2) {
return new TeeOutputStream(out1, new FilterOutputStream(out2));
}
private OutputStream getDestination(String name) {
return new BufferedOutputStream(new FileOutputStream(new File(name)));
}
...
InputStream in = new FileInputStream(new File("dummyfile.txt"));
OutputStream out = getFilteredStream(getDestination("dest1"), getDestination("dest2"));
long start = System.currentTimeMillis();
IOUtils.copy(in, out);
out.flush();
long end = System.currentTimeMillis();
System.err.println(((end - start) / 1000.0) + " seconds");
// close the files

结果:

1.672 seconds

如果我删除 FilterOutputStream...

private OutputStream getFilteredStream(OutputStream out1, OutputStream out2) {
return new TeeOutputStream(out1, out2);
}

...再次运行,结果为:

0.797 seconds

我预计在使用 FilterOutputStream 时会出现性能损失,但我不希望损失会加倍,尤其是在未覆盖任何方法时。我查看了 FilterOutputStream 的源代码,但没有看到任何会导致如此巨大的惩罚。

有人可以解释可能导致此问题的原因吗?

最佳答案

速度较慢,因为 FilterOutputStream 中的默认实现禁用 block 处理并通过 write(int b) 方法发送所有字节,一次一个。

这是 documented :

Note that this method does not call the write method of its underlying input stream with the same arguments. Subclasses of FilterOutputStream should provide a more efficient implementation of this method.

关于Java 的 FilterOutputStream 增加了性能损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47721200/

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