2017-05-16 1 views
2

요구 사항 : 디렉토리는 "DIR1"을 제외한 모든 이름을 가질 수이 Perl 파일을 최적화하는 방법은 무엇입니까?

  1. 다음 기준에 일치하는 입력 디렉토리 아래에 디렉토리의 수를 얻으려면, "DIR2", "DIR3"등
  2. 디렉토리 "DIR1", "DIR2", "DIR3"내부 등,
  3. 혼자 디렉토리의 수를 필요에 파일
use strict; 
use File::Find; 

my ($inputdir) = @ARGV; 
my (@branches, $branch, $directory, @directories); 
my $count = 0; 

find(\&wanted, $inputdir); 
    while (defined($directory = shift @directories)) { 
      if (-d $directory){ 
      next if ($directory =~ "DIR1" || $directory =~ "DIR2" || $directory =~ "DIR3"); 
        push @branches, $directory; 
        $count++; 
      } 
    } 

print "Total number of directories: $count \n"; 

sub wanted{ 
    push @directories, $File::Find::name; 
    return @directories; 
} 
,691을 계산하지 할 필요는 없다

이 코드는 필요한 출력을 제공하지만 꽤 많은 시간이 걸립니다.

이 코드를 개선하는 데 소요되는 시간을 줄일 수있는 방법을 제안하십시오.

+1

몇 개의 디렉토리가 있습니까? – simbabque

+2

코드에 대한 것이므로이 질문을 주제와 관련이 없으므로 닫으려고합니다. https://codereview.stackexchange.com/ – Jens

+0

@simbabque 약 50 만 –

답변

3

File::Find::Rule은 전체 가지를 건너 뛸 수 있습니다 모두

use warnings; 
use strict; 

use File::Find::Rule; 

my $start_dir = shift || '.'; 

my $re_skip = qr/DIR(?:1|2|3)/; 

my $ok = File::Find::Rule->directory; # add selection rules as needed 
my $skip = File::Find::Rule->directory 
    ->name(qr/$re_skip/) 
    ->prune 
    ->discard; 

my @dirs = File::Find::Rule -> any($skip, $ok) -> in($start_dir); 

print "Total: ", scalar @dirs, "\n"; 

이 여전히 큰 파일 시스템으로 시간이 좀 걸릴 가지고 있지만 훨씬 더 좋을 것이다. 한 - 라이너에서

,이에서 필요로하는 모든 내가 스크립트 코드의 일부를 통합 한 그냥 빨리 카운트

perl -MFile::Find::Rule -wE' 
    $ffr = File::Find::Rule; 
    $skip = $ffr->directory->name(qr/DIR(?:1|2|3)/)->prune->discard; 
    say scalar $ffr->any($skip, $ffr->directory)->in(".")' 

경우.

다음 단계는 멀티 스레드 실행을 사용하는 것입니다 (여기서는 fork을 사용합니다). 그룹 서브 디렉토리는 서브 카운트의 대략적인 균형을 이루고 위 그룹과 같은 것을 병렬로 실행합니다. 이득은 하드웨어에 따라 다르지만 속도 향상 요인이 있어야합니다.

+0

감사합니다. @zdim! 파일 찾기 규칙을 사용하면 시간이 반으로 줄어들었지만 아직 멀티 스레드를 시도하지는 못했습니다. –

+0

@king 위와 같이해야합니다. 분기 코드가 도움이되는지 알려주세요. 추가 할 수 있습니다. – zdim

관련 문제