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

时间:2013-01-08 22:07:10

标签: objective-c performance macos cocoa

我需要使用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。如果该方法适用于所有类型的URL,那将是一个奖励。

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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

例如,家庭内容可能是:

  

ab1.txt
  bb.txt
  c.txt

文件目录可能包含:

  

adf.txt
  fgh.txt

所以你只需将它们与自定义算法合并,该算法只应用mergesort的合并部分。

答案 1 :(得分:0)

我对排序进行了基准测试。事实证明,absoluteStringrelativeStringpathrelativePath快得多。

排序约26000个条目:

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

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