gpt4 book ai didi

objective-c - 使用 localizedStandardCompare 对 NSURL 进行排序的性能

转载 作者:行者123 更新时间:2023-12-03 17:23:29 24 4
gpt4 key购买 nike

我需要使用 localizedStandardCompare 对包含 NSURL 的 NSMutableArray 进行排序:

[array sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
NSString *f1 = [(NSURL *)obj1 absoluteString];
NSString *f2 = [(NSURL *)obj2 absoluteString];
return [f1 localizedStandardCompare:f2];
}];

这工作得很好,但我有点担心性能:在排序过程中该 block 将被评估 n log n 次,所以我希望它能够很快(数组可能最多有 100,000 个元素)。由于 localizedStandardCompare 仅适用于 NSString,因此我需要将 URL 转换为字符串。上面,我使用了absoluteString,但是还有其他返回NSString的方法,例如relativeString。阅读 NSURL 类引用,我得到的印象是,relativeString 可能更快,因为 URL 不需要解析,但这是我第一次使用 Cocoa 和 OS-X,因此只是一个疯狂的猜测。

附加约束:在这种情况下,所有 URL 都来自本地存储上的 NSDirectoryEnumerator,因此都是文件 URL。不过,如果该方法适用于所有类型的 URL,那就太好了。

我的问题:我应该使用哪种方法将 NSURL 转换为 NSString 以获得最佳性能?

分析所有可能的方法也许是可能的,但我只有一台(相当快的)OS-X 机器,谁知道呢 - 有一天代码可能最终会出现在 iOS 上。

我在 OS-X 10.8.2 上使用 Xcode 4.5.2,但该程序也应该在旧版本上运行(在合理范围内)。

最佳答案

您可能需要使用Carbon的FSCatalogSearch,它比NSDirectoryEnumerator更快。至于走哪条路,我认为别无选择。

为了加快排序速度,您唯一可以考虑的是对路径进行部分排序,因为文件系统将按字母顺序返回同一文件夹的所有文件。

因此您可能想要获取同一目录的所有路径并将它们与其他结果合并。

例如,主页内容可能是:

ab1.txt
bb.txt
c.txt

文档目录可能包含:

adf.txt
fgh.txt

因此,您只需使用自定义算法将它们合并,该算法仅应用合并排序的合并部分。

关于objective-c - 使用 localizedStandardCompare 对 NSURL 进行排序的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14224863/

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