gpt4 book ai didi

java - Files.readAllLines() 执行时间更改

转载 作者:行者123 更新时间:2023-11-30 03:42:26 26 4
gpt4 key购买 nike

我正在研究从文件中读取数字的不同方法以及它们的效率,这是我当前正在使用的一种方法:

public static long getNumbers1() {
final long startTime = System.nanoTime();

try
{
String input = new String(Files.readAllBytes(file.toPath()));
String[] stringNumbers = input.split("\\W");

int[] numbers = new int[stringNumbers.length];
for(int index = 1;index < stringNumbers.length;index++)
{
numbers[index] = Integer.parseInt(stringNumbers[index]);
}
}
catch (IOException e)
{
e.printStackTrace();
}

final long endTime = System.nanoTime();
System.out.println(endTime + " | " + startTime + " | " + (endTime - startTime));
return endTime - startTime;
}

file 在全局范围内声明:

private static File file = new File(System.getProperty("user.dir") + "/data/numtest.txt");

然后通过以下方式运行此方法:

for (int index = 0;index < 10;index++)
{
getNumbers1();
}

控制台打印如下:

15395409456370 | 15395397323226 | 12133144
15395410416178 | 15395410090933 | 325245
15395411137449 | 15395410835563 | 301886
15395411806342 | 15395411515427 | 290915
15395412389234 | 15395412097611 | 291623
15395412780660 | 15395412529737 | 250923
15395413168193 | 15395412912315 | 255878
15395413538738 | 15395413302679 | 236059
15395413948214 | 15395413665792 | 282422
15395414329376 | 15395414083762 | 245614

您会注意到,第一次读取文件时的第一个“运行时间”值(第三个值)明显大于后续读取的值。无论我运行程序多少次,或者 for 循环运行多少次(100 或 100000),第一个值总是大得多。为什么会发生这种情况?我可以阻止它发生吗? JAVA 是否很聪明,会存储文件中的值,并且实际上不会每次都重新读取文件?

我很好奇...

最佳答案

文件 IO 使用类似于请求分页的技术将部分文件加载到物理内存中。磁盘文件页面到物理内存页面的映射由分页操作系统维护。

首次加载时,由于请求的文件页面不在物理内存中,因此会生成页面错误。当您尝试再次加载时,某些页面将在物理内存中找到,并且不需要从磁盘重新读取。如果对物理内存中的页面进行任何更改,页面输出可确保将脏页面刷新到磁盘。

您还会注意到这一点:当第一次尝试在您最喜欢的文本编辑器中打开文件时,需要一段时间。当您关闭文件并重新打开它时,加载速度会更快。这是因为磁盘文件页面已经在物理内存中。

当您通过 Java 重新读取文件时,也会发生同样的情况。优化重读的是操作系统,而不是 Java。

关于java - Files.readAllLines() 执行时间更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26534739/

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