0
我編寫了使用NIO和IO讀取和寫入文件。然後我在相同的磁盤環境中執行了簡單的性能測試。我的測試是從一個目錄中讀取一個文件(~5MB),並將其寫入不同的目錄(相同的磁盤)。Centos 7中的NIO和IO性能問題(第一次和第二次讀取和寫入)
首先測試(檢驗.pdf):
- NIO:Elasped時間:80.457224毫秒
- IO:Elasped時間:4.51824毫秒
第二次測試,使用相同的文件(測試。 PDF):
- NIO:Elasped時間:4.732797毫秒
- IO:Elasped時間:4.059444毫秒
我的問題是,爲什麼在第一次測試中,NIO花了更長的時間比IO和第二測試爲什麼NIO花了差不多同一時間IO?我有點困惑。
這裏是代碼片段(非常基本的,公知的代碼):
int BUFFER_SIZE = 64 * 1024;
NIO:
ByteBuffer buffer = ByteBuffer.allocateDirect(BUFFER_SIZE);
try (SeekableByteChannel seekableChannelToRead = Files.newByteChannel(readFilePath,EnumSet.of(StandardOpenOption.READ));
SeekableByteChannel seekableChannelToWrite = Files.newByteChannel(writeFilePath, EnumSet.of(StandardOpenOption.CREATE, StandardOpenOption.WRITE))) {
Long startTime = System.nanoTime();
int byteCount = 0;
while ((byteCount = seekableChannelToRead.read(buffer)) > 0) {
buffer.flip();
seekableChannelToWrite.write(buffer);
buffer.clear();
}
Long elapsedTime = System.nanoTime() - startTime;
System.out.println("FileName: " + path.getFileName() + "; Elapsed Time is " + (elapsedTime/1000000.0) + " msec");
} catch (Exception e) {
e.printStackTrace();
}
IO:
try (FileInputStream in = new FileInputStream(path.toFile());
FileOutputStream out = new FileOutputStream(writeFilePath.toFile())) {
Long startTime = System.nanoTime();
byte[] byteArray = new byte[BUFFER_SIZE]; // byte-array
int bytesCount;
while ((bytesCount = in.read(byteArray)) != -1) {
out.write(byteArray, 0, bytesCount);
}
Long elapsedTime = System.nanoTime() - startTime;
System.out.println("Elapsed Time is " + (elapsedTime/1000000.0) + " msec");
} catch (IOException ex) {
ex.printStackTrace();
}
您正在使用SAN /慢速磁盤嗎?一種可能性是,您的第一次測試將文件從san加載到緩衝區中,並且所有連續的測試都從內存中運行。至少在java7'io'使用'nio'的情況下,無論提供哪種性能提升,4.7到4.1都會在我的預期之內。 – Jonathan
感謝您的回覆。不,我沒有使用SAN /慢速磁盤。我正在測試我的工作站。它是奔騰5,硬盤7200轉。 – MFH
您進行過多少次測試? – chrylis