2011-12-23 5 views
2

디렉토리를 반복 할 때 fileAttributes 메소드를 호출하는 것이 얼마나 비쌉니까?NSDirectoryEnumerator의 fileAttributes 메소드의 성능 특성은 무엇입니까?

특히, 열거 된 경로가 디렉토리인지 확인하고 싶습니다. fileAttributes 사전이나 파일 관리자를 사용하는 것이 더 좋습니까? 단지 isDirectory (아래 예)

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이 외에도 "불필요한"정보의 톤을 반환, 여기에 파일 관리자뿐만 아니라 우리가 이미를 열거하고 있기 때문에 낭비 보인다 호출 반면 샘플 출력

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"호출과 동일합니다.

(전체) 파일 속성을 가져 오려면 파일에 대한 정보를 추가적으로 읽어야합니다. 아이 노드에는 파일 크기, 유형 등에 대한 정보가 들어 있습니다. 각 파일 속성 호출에는 추가 IO 읽기 조작이 필요할 수 있습니다 (여기서는 모든 캐시가 무시됩니다).

그러나 HFS/HFS +는 다릅니다. 디렉토리 항목 (Source Code)에 파일 유형을 저장하는 것이 특별합니다. 따라서 파일이 inode 정보에 액세스하지 않고 디렉토리인지 확인할 수 있습니다. NSFileManager의 fileExistsAtPath:isDirectory:은 훨씬 빨라야합니다. 가능하다면 수백 또는 수천 개의 파일이 관련 될 경우에만 문제가 될 수 있지만 어쨌든 더 빨라야합니다.

BTW : ext4 또한 "filetype"플래그가 비활성화되어 있지 않은 한 similar feature이 아니면

관련 문제