gpt4 book ai didi

java - Centos 7中NIO和IO性能问题(第一次和第二次读写)

转载 作者:行者123 更新时间:2023-12-01 09:38:50 25 4
gpt4 key购买 nike

我已经编写了使用 NIO 和 IO 读写文件的代码。然后我在相同的磁盘环境下进行了简单的性能测试。我的测试是从一个目录读取一个文件(~5MB)并将其写入不同的目录(同一磁盘)。

第一次测试(test.pdf):

  • NIO:耗时:80.457224 毫秒
  • IO:耗时:4.51824 毫秒

第二次测试,使用相同的文件(test.pdf):

  • NIO:耗时:4.732797 毫秒
  • IO:耗时:4.059444 毫秒

我的问题是,为什么在第一次测试中,NIO 比 IO 花费更长的时间,而在第二次测试中,为什么 NIO 花费的时间与 IO 几乎相同?我有点困惑。

这是代码片段(非常基本、众所周知的代码):

int BUFFER_SIZE = 64 * 1024;

蔚来:

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();
}

最佳答案

第一次测试运行缓慢,因为第一次必须从磁盘存储加载文件。

在 7200rpm 的驱动器上用 80ms 加载文件并不一定是异常的。您的驱动器的寻道时间可能约为 8 毫秒,我们不知道文件是否存在碎片。

加载后,文件存储在缓冲区缓存中,后续请求(甚至不同的进程)加载速度要快得多。内核将文件存储在缓冲区高速缓存中,以加快常用文件的访问时间。

在进行基准测试时,通常最好完全在内存中执行测试...或预取文件内容,使其存在于缓冲区缓存中。

关于java - Centos 7中NIO和IO性能问题(第一次和第二次读写),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38616575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com