我需要使用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,但该程序也适用于旧版本(在合理的范围内)。
答案 0 :(得分:0)
您可能需要使用Carbon的FSCatalogSearch,它比NSDirectoryEnumerator更快。至于走这条路,我别无选择。
您可以考虑加速排序的唯一方法是路径部分排序,因为文件系统将按字母顺序返回同一文件夹的所有文件。
因此,您可能希望获取同一目录的所有路径,并将它们与其他结果合并。
例如,家庭内容可能是:
ab1.txt
bb.txt
c.txt
文件目录可能包含:
adf.txt
fgh.txt
所以你只需将它们与自定义算法合并,该算法只应用mergesort的合并部分。
答案 1 :(得分:0)
我对排序进行了基准测试。事实证明,absoluteString
和relativeString
比path
或relativePath
快得多。
排序约26000个条目:
relativeString 550ms
absoluteString 580ms
path 920ms
relativePath 960ms
field access 480ms
对于字段访问,我将absoluteString
的值放入排序和访问之前的字段中。因此,...String
访问器几乎与字段访问一样快,因此对我的用例来说是一个不错的选择。