我对异步文件I/O的理解可能是错误的,但我正在尝试使用最新的JDK7的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时,有很多文件描述符。感谢您的任何澄清和帮助!
发布于 2011-10-23 21:21:24
在第一个例子中,你没有关闭文件,在第二个例子中,你关闭了文件。
我会确保你只测试你感兴趣的东西。否则,添加getByte()可能是延迟的原因,您只在第一种情况下才这样做。我建议你在启动计时器之前先从byte[]开始,这两种情况下都是相似的,以便进行相似的比较。
注意:如果你有一个使用缓冲流/写入器的数据/文本块,充其量只会增加开销。
当涉及到写入真正的文件时,将数据写入磁盘是瓶颈。您的系统可以以许多GB/s的速度复制数据,但大多数旋转磁盘只能保持50-100 MB/s的写入速度,因此在Java中稍微提高效率可能不会得到您想要的结果。
https://stackoverflow.com/questions/7866343
复制相似问题