我对异步文件 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 空闲和线程等待。以上是基于我对异步文件 I/O 的理解,我承认这可能是错误的。
除了性能较差之外,还有一件奇怪的事情是当我执行 ls -l/proc/p
时有很多文件描述符。
感谢您的任何澄清和帮助!
最佳答案
在第一个例子中,你没有关闭文件,在第二个例子中你关闭了。
我会确保您只测试您感兴趣的东西。否则可能是因为添加您只在第一种情况下执行的 getByte() 是造成延迟的原因。我建议您在两种情况下启动计时器之前先使用 byte[] 来进行类似比较。
注意:如果您有一个使用缓冲流/写入器的数据/文本 block ,充其量只会增加开销。
在写入真实文件时,将数据写入磁盘是瓶颈。您的系统可以以许多 GB/s 的速度复制数据,但大多数旋转磁盘只能维持 50-100 MB/s 的写入速度。因此,在 Java 中稍微提高效率可能不会给您带来想要的结果。
关于Java AsynchronousFileChannel 在 Linux 中有很多打开的文件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7866343/