1

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

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

这很好用,但我有点担心性能:在排序过程中,块将被评估 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,但该程序也应该在旧版本上运行(在合理范围内)。

4

2 回答 2

0

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

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

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

例如,主页内容可能是:

ab1.txt
bb.txt
c.txt

文档目录可能包含:

adf.txt
fgh.txt

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

于 2013-01-08T22:50:08.347 回答
0

我对排序进行了基准测试。事实证明absoluteString和比orrelativeString快得多。pathrelativePath

对大约 26000 个条目进行排序:

relativeString      550ms
absoluteString      580ms
path                920ms
relativePath        960ms
field access        480ms

对于字段访问,我在排序之前将 的值absoluteString放入一个字段中并访问它。因此,...String访问器几乎与字段访问一样快,因此对于我的用例来说是一个不错的选择。

于 2013-01-22T13:02:31.687 回答