gpt4 book ai didi

swift - 限制 Swift 线程中的 CPU 使用率

转载 作者:行者123 更新时间:2023-12-04 02:27:10 27 4
gpt4 key购买 nike

我想在 macOS 应用程序中遍历文件树以获得一个可能很大的目录。如果我只是这样做,我的示例案例大约需要 3 分钟,但在这 3 分钟内 CPU 峰值达到 80% 左右。

我可以在后台线程上更慢地执行此操作,但不确定最佳方法是什么。

我想在循环中插入 1 毫秒的 sleep 时间,但我不确定这不会对调度/磁盘 IO 等产生负面影响。另一种方法是做 1 秒的工作,然后等待 2- 3 秒,但我猜还有更优雅的东西?

我想要的核心功能是以嵌套方式遍历目录检查文件属性:

let enumerator = FileManager.default.enumerator(atPath: filePath)
while let element = enumerator?.nextObject() as? String {
// do something here
}

最佳答案

通常,让 CPU 短时间达到峰值比长时间以低水平运行更节能。只要您的进程的优先级低于其他进程,即使短时间以 100% 的速度运行 CPU 也不是问题(特别是如果它没有打开风扇)。现代 CPU 喜欢在短时间内非常努力地运行,然后完全空闲。较长时间的“有点忙”会更糟,因为 CPU 无法关闭任何子系统。

即便如此,当用户看到高 CPU 使用率时,他们还是会非常不高兴。我曾经从事系统管理软件方面的工作,我们与 Apple 就限制我们的 CPU 使用率进行了交谈。他们告诉我们上述情况。我们说“是的,但是当用户看到我们以 100% 的速度运行时,他们会向 IT 投诉并尝试卸载我们的应用程序。” Apple 的回答是使用 sleep,就像您描述的那样。如果它使您的过程花费更长的时间,那么它可能会对总能源使用产生负面的总体影响。但我不认为它会造成任何其他麻烦。

就是说,如果您多次扫描同一个目录树,您应该查看 File System EventsFile Metadata Search这可能会更有效地执行此操作。

另请参阅:Schedule Background Activity在 Mac 应用程序的能效指南中。我强烈推荐整个文档。近年来,macOS 中添加了许多工具,它们可能对您的问题有用。我也推荐Writing Energy Efficient Apps来自 WWDC 2017。

如果您确实需要用枚举器直接扫描所有内容,您可能可以通过使用 URL-based API 来大大改善事情而不是基于字符串的 API。它允许您预取某些值(包括 attributeModificationDateKey,在这里可能会用到)。另外,请注意 DirectoryEnumerator 的 fileAttributes 属性,它缓存最后读取的文件的属性(因此您不需要再次查询它们)。

三分钟很长;有可能你做的工作比需要的多。使用 find 命令行工具运行您的操作,并将其用作应该花费多少时间的基准。

关于swift - 限制 Swift 线程中的 CPU 使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66745904/

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