1

NSURL を含む NSMutableArray を localizedStandardCompare でソートする必要があります。

[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していますが、relativeString など、NSString を返すメソッドは他にもあります。NSURL クラス リファレンスを読むと、URL を解決する必要がないため、relativeString の方が高速であるという印象を受けます。

追加の制約: この場合、すべての URL はローカル ストレージの NSDirectoryEnumerator から取得されるため、すべてファイル URL です。ただし、このメソッドがすべての種類の URL で機能する場合はボーナスです。

私の質問: 最高のパフォーマンスを得るには、NSURL を NSString に変換するためにどの方法を使用する必要がありますか?

考えられるすべての方法をプロファイリングすることは可能かもしれませんが、私は (かなり高速な) OS-X マシンを 1 台しか持っていません。

OS-X 10.8.2 で Xcode 4.5.2 を使用していますが、プログラムは古いバージョンでも (妥当な範囲内で) 動作するはずです。

4

2 に答える 2

0

NSDirectoryEnumeratorよりも高速なCarbonのFSCatalogSearchを使用する必要がある場合があります。パスを取得することに関しては、私は選択の余地がありません。

ファイルシステムは同じフォルダのすべてのファイルをアルファベット順に返すため、並べ替えを高速化するために検討できるのは、パスが部分的に並べ替えられていることだけです。

したがって、同じディレクトリのすべてのパスを取得して、それらを他の結果とマージすることができます。

たとえば、ホームコンテンツは次のようになります。

ab1.txt
bb.txt
c.txt

ドキュメントディレクトリには次のものが含まれる場合があります。

adf.txt
fgh.txt

したがって、それらをカスタマイズされたアルゴリズムとマージするだけで、マージソートのマージ部分を適用するだけです。

于 2013-01-08T22:50:08.347 に答える
0

私はその種類をベンチマークしました。それが判明し、それabsoluteStringよりrelativeStringもはるかに高速pathですrelativePath

約26000エントリの並べ替え:

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

フィールドアクセスの場合absoluteString、並べ替えの前にの値をフィールドに入力してアクセスします。したがって、...Stringアクセサはフィールドアクセスとほぼ同じ速度であるため、私のユースケースに適しています。

于 2013-01-22T13:02:31.687 に答える