2013-05-10 2 views
0

FileSystemIterator 내가 정렬해야합니다.정렬 된 파일 목록의 속도를 높이려면 어떻게해야합니까?

I 정렬 기능을 다음과 같이 iterator_to_array(new FileSystemIterator($dir, FilesystemIterator::SKIP_DOTS))uaSort 기능을 사용 : 나는에서 1063 개 파일과 디렉토리가

function nameSort($a, $b) { 
    if($a->isDir() === $b->isDir()){ 
     return strNatCaseCmp($a->getFilename(), $b->getFilename()); 
    } 
    return $a->isDir() ? -1 : 1; 
} 

$ DIR 및 파일의 nameSort가 호출되는 11,369 배 목록이 생성됩니다 약 6 초의 평균 시간. 항목이 디렉토리인지 여부에 대한 추가 테스트를 생각했습니다 uaSort nameSort을 더 많이 호출했으나 이있는 행을 제거했을 때이 가정이 잘못되었습니다. 11957로 전화가 걸려서 전화가 끊겼습니다. 0.6 초.

isDir이 매우 느립니다 (목록이 10 배 느려짐). 어떻게 속도를 높일 수 있습니까?

답변

2

isDir을 호출하는 경우 비용이 많이 들고 경로마다 여러 번 호출하는 경우 무언가가 디렉터리에 있으면 캐시하고 캐시에서 먼저 검색 할 수 있습니다. 이것은 isDir 방법에 대한 많은 호출을 안전하게 할 수 있습니다.

+0

을 사람들을 array_filter 수 있습니다. –

1

glob를 사용할 수있는 단일 디렉토리의 내용 만 얻으려고하는 경우.

$file = glob($path."/*", GLOB_MARK); 

은 이미 정렬되어야하며, 디렉토리는 미행로 식별 할 수 있습니다/너무 이상적이지만 꽤 좋은하지 약 1 초, tooks 캐시 때 당신은

+0

처음에는 glob을 사용하고 싶었지만 Iterator가 더 좋았습니다. 왜냐하면 모든 SplashInfo를 제공했기 때문입니다. is_dir과 pathinfo 같은 함수를 사용하는 것이 더 빠를 수 없다면 테스트를 위해 glob을 다시 시도 할 것입니다. –

+0

이 경우 GLOB_MARK 플래그가 설정되어'substr ($ file, -1) == DIRECTORY_SEPARATOR'에 의해 디렉토리를 테스트 할 수 있어야하고, 값이 더 싸며 is_dir을 호출해야합니다 – Orangepill

관련 문제