我对asynch文件I / O的理解可能有误,但我正在尝试使用最新的JDK 7的AsynchronousFileChannel来加速应用程序,导致意外的更糟糕的结果。应用程序在我进行更改之前使用了与PrintWriter的同步模式,如下所示:
if( asynchMode ){
AsynchronousFileChannel writer = AsynchronousFileChannel.open(Paths.get(outputFileName),
StandardOpenOption.WRITE, StandardOpenOption.CREATE);
((AsynchronousFileChannel)writer).write(ByteBuffer.wrap(builder.toString().getBytes()), 0);
else{
PrintWriter writer = null;
try{
writer = new PrintWriter(new BufferedWriter(new FileWriter(
outputFileName)));
((PrintWriter)writer).write(builder.toString());
}
finally{
if( null!=writer )
writer.close();
}
}
上面的代码存在于自己的类中。变量asynchMode
允许我改变程序的行为。由于应用程序编写了很多真正无需进一步验证的文件,我宁愿不让CPU空闲而线程在写入文件时等待。以上是基于我对asynch文件I / O的理解,我承认可能在错误的基础上。
除了较差的表现之外,一个奇怪的事情是当我做ls -l /proc/p
时有很多文件描述符。
感谢您的任何澄清和帮助!
答案 0 :(得分:1)
在第一个示例中,在第二种情况下,不要关闭文件。
我会确保你只测试你感兴趣的东西。否则它可能是添加getByte()你只在第一种情况下做的是延迟的原因。我建议你在启动计时器之前先用字节[]开始,在这两种情况下都是为了比较。
注意:如果您使用缓冲流/写入器有一个数据/文本块,则最多只增加开销。
在编写真实文件时,将数据写入磁盘是瓶颈。您的系统可以以许多GB / s的速度复制数据,但大多数旋转磁盘只能维持50-100 MB / s的写入速度。因此,在Java中稍微提高效率可能无法为您提供所需的结果。