gpt4 book ai didi

java文件相对化方法性能

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

我有一个代码可以迭代超过 100 000 个文件并获取它们到某个根目录的相对路径并且代码可以正常工作但与另一个丑陋的解决方案相比速度较慢(这是奇怪的代码但速度更快)。

原代码在这里:

File file, URI rootDirURI
for() {
blabla = rootDirURI.relativize(file.toURI()).getPath()
}

对比

File file, URI rootDirURI
for() {
String rootDirPath = rootDirURI.getPath().substring(1); // cut the first slash
rootDirPath = rootDirPath.replaceAll("/", "\\\\"); // correct windows slashes
String finalPath = file.getAbsolutePath().replace(rootDirPath, ""); // clear the root path: relativize
blabla = finalPath.replace("\\", "/"); // slashes
}

好吧,第一个 for 循环运行时间超过 2 分钟,第二个 for 循环运行时间不到 2 秒...文件通过 UNC 路径加载,但是这个 for 循环是在执行 Files.walkFileTree 之后。我在我的文件系统中创建了符号链接(symbolic link),它的目标是 UNC 路径,如\\192.168.1.x\public\something 第一部分加载 ArrayList 中的所有内容,第二部分对 ArrayList 中的文件应用一些操作(上面的循环代码)。

relativize是性能差还是toURI方法?

最佳答案

正如@Thomas 已经指出的那样,Path.relativize()绝对不仅仅是简单的字符串替换。

但在这种特殊情况下,您遇到的瓶颈可能是 File.toURI() ,因为它涉及文件系统访问,当它尝试确定您的文件是否是目录时。

例如以下测试代码:

ArrayList<File> files = ...;
URI rootURI = base.toURI();
for(File ff : files) {
String relative = rootURI.relativize(ff.toURI()).getPath();
}

当应用于包含 100000 个文件的数组时,在我的机器上运行花费了 68993 毫秒

并根据jvisualvm , 它大部分时间都在

java.io.UnixFileSystem.getBooleanAttributes0()

native 方法。

enter image description here

可以追溯到File.toURI() -> File.isDirectory()

URI 数组上运行的等效代码对象

ArrayList<URI> files = ...;
URI rootURI = base.toURI();
for(URI ff : files) {
String relative = rootURI.relativize(ff).getPath();
}

仅需 3810 毫秒即可完成,即快了将近 ~20 倍。

关于java文件相对化方法性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42246307/

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