2011-12-23 6 views
2

ディレクトリを反復処理するときにfileAttributesメソッドを呼び出すのはどれくらいの費用がかかりますか?NSDirectoryEnumeratorのfileAttributesメソッドのパフォーマンス特性は何ですか?

特に、列挙されるパスがディレクトリであるかどうか確認したいと思います。 fileAttributes辞書またはファイルマネージャを使用する方が良いですか?我々はすでに列挙されているので、ファイルマネージャを呼び出すことだけでなく、無駄なようだのに対し(下記の例)

NSString *path = "/User/Jack/Documents"; 
NSDirectoryEnumerator *dirEnum = [filemanager enumeratorAtPath:path]; 
NSString *file; 
BOOL isDir; 
while (file = [dirEnum nextObject]) { 
    NSLog(@"File: %@", file); 
    NSString * p = [path stringByAppendingPathComponent:file]; 
    BOOL isDir1; 
    [[NSFileManager defaultManager] fileExistsAtPath:p isDirectory:&isDir1]; 
    BOOL isDir2 = [[dirEnum fileAttributes] objectForKey:@"NSFileType"] == NSFileTypeDirectory; 
    NSLog(@"isDirectory using fileExistsAtPath:isDirectory: = %d", isDir1); 
    NSLog(@"isDirectory using FileAttributes = %d", isDir2);   
} 

fileAttributesがちょうどisDirectoryに加えて、「不要」な情報のトンを返し、ここではサンプル出力

2011-12-23 16:17:40.523 App[10190:707] File Attributes: { 
    NSFileCreationDate = "2011-10-23 04:04:51 +0000"; 
    NSFileExtensionHidden = 0; 
    NSFileGroupOwnerAccountID = 80; 
    NSFileGroupOwnerAccountName = admin; 
    NSFileModificationDate = "2011-10-23 04:07:52 +0000"; 
    NSFileOwnerAccountID = 501; 
    NSFileOwnerAccountName = Tony; 
    NSFilePosixPermissions = 493; 
    NSFileReferenceCount = 6; 
    NSFileSize = 204; 
    NSFileSystemFileNumber = 8381694; 
    NSFileSystemNumber = 234881029; 
    NSFileType = NSFileTypeDirectory; 
} 

です問題のディレクトリ。

洞察?

答えて

4

ほとんどのファイルシステムでは、両方の方法でファイルが存在するかどうかをチェックし、ディレクトリエントリデータに加えてinodeデータにアクセスする必要があるため、ディレクトリであるかどうかを確認するのに同じ時間がかかります。これはファイルごとに "stat"コールに相当します。

(フル)ファイル属性を取得するには、ファイルに関する情報を追加で読み取る必要があります。 inodeには、ファイルサイズ、タイプなどの情報が含まれています。各ファイル属性呼び出しでは、余分なIO読み取り操作が必要になる場合があります(ここではすべてのキャッシュは無視されます)。

ただし、HFS/HFS +は異なります。これは、ファイルタイプをディレクトリエントリ(Source Code)に保存するという点で特別です。したがって、ファイルがiノード情報にアクセスせずにディレクトリであるかどうかを確認することができます。 NSFileManagerのfileExistsAtPath:isDirectory:はもっと速くなければなりません。可能であれば、何百、何千ものファイルが関わっていれば、これは本当に問題になりますが、とにかく速くなければなりません。

BTW:ext4また、similar feature "filetype"フラグが無効でない限り。

関連する問題