Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java';s FilterOutputStream会增加性能损失_Java_Performance - Fatal编程技术网

Java';s FilterOutputStream会增加性能损失

Java';s FilterOutputStream会增加性能损失,java,performance,Java,Performance,我有一段代码将输出流拆分为两个目的地。它们都将指向一个文件,但第二个目标将通过过滤器。我试图弄明白为什么仅仅包装FilterOutputStream而不重写任何方法会增加巨大的性能损失 我创建了一个358兆字节的文件: dd if=/dev/zero of=dummyfile.txt count=700000 bs=512 对其运行此代码: private OutputStream getFilteredStream(OutputStream out1, OutputStream out2)

我有一段代码将输出流拆分为两个目的地。它们都将指向一个文件,但第二个目标将通过过滤器。我试图弄明白为什么仅仅包装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
如果我删除过滤器OutputStream

private OutputStream getFilteredStream(OutputStream out1, OutputStream out2) {
    return new TeeOutputStream(out1, out2);
}
。。。然后再次运行,结果是:

0.797 seconds
我希望在使用FilterOutputStream时会有性能损失,但我不希望损失是双倍的,特别是在不重写任何方法时。我查看了FilterOutputStream的源代码,但没有看到任何会造成如此巨大损失的代码


有人能解释一下是什么导致了这个问题吗?

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

这是:

请注意,此方法不会使用相同的参数调用其底层输入流的write方法FilterOutputStream的子类应提供此方法更有效的实现


使用探查器查看发生了什么。向管道中添加普通的
FilterOutputStream
,而不将其子类化以执行任何实际的筛选,这有什么意义呢?没有意义,我只是试图演示我看到的问题。事实上,在重写write(byte b[],int off,int len)方法之后,表演恢复正常了。