gpt4 book ai didi

swift - 为什么 FileManager.default.enumerator 使用 URL 比使用 Swift 中的字符串快 3 倍?

转载 作者:行者123 更新时间:2023-12-04 07:53:46 25 4
gpt4 key购买 nike

我需要遍历文件树的很大一部分(500k+ 个文件),并从传递 FileManager.default.enumerator() 切换到StringURL .遍历速度提高了 3 倍,我正在寻找原因。
我正在使用 APFS 格式的驱动器在 Mac 上进行测试。
这是我在 Swift Playground 中测量的测试代码:

import Cocoa

var startingTime: Date
var pathCount = 0
var urlCount = 0

let path = "/Users/tom/myfolder/"
let pathEnumerator = FileManager.default.enumerator(atPath: path)

let url = URL(fileURLWithPath: path)
let urlEnumerator = FileManager.default.enumerator(at: url, includingPropertiesForKeys: nil)


print("== URL Enumerator ==")
startingTime = Date()
while let _ = urlEnumerator?.nextObject() as? URL {
urlCount += 1
}
print("\n\(urlCount) files.")
print("\(startingTime.timeIntervalSinceNow * -1) seconds elapsed")

print("\n\n")

print("== Path/String Enumerator ==")
startingTime = Date()
while let _ = pathEnumerator?.nextObject() as? String {
pathCount += 1
}
print("\n\(pathCount) files.")
print("\(startingTime.timeIntervalSinceNow * -1) seconds elapsed")
这是我得到的输出:
== URL Enumerator ==

541879 files.
40.580654978752136 seconds elapsed

== Path/String Enumerator ==

541879 files.
118.60869300365448 seconds elapsed
如果我更改顺序(先执行 String 版本),则没有任何区别,因此它似乎不是缓存人工制品。

最佳答案

感谢@Willeke 的建议,我从 Xcode 的“Time Profiler”工具运行了它,并查看了每个路径的调用堆栈。它突出了两种方法之间的行为差​​异。URL 的调用堆栈方法:
URL call stackString 的调用堆栈方法:
String (path) call stack
我对此的最佳解释是,较旧的String API 是树的递归爬取,它带来了大量的性能开销,而较新的 URL API“知道”文件树,并且可以迭代地遍历它。
@Martin R 建议我在编译的应用程序中检查这个(这是屏幕截图的来源)。差异仍然是 2 倍,但它们都比 Playground 快得多(11 秒对 22 秒)。

关于swift - 为什么 FileManager.default.enumerator 使用 URL 比使用 Swift 中的字符串快 3 倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66812545/

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