2013-04-02 2 views
-1

다음은 내가 최적화하려고하는 서브 루틴입니다. 대부분의 경우 배열 참조를 사용합니다. 현재이 서브 루틴은 대략 걸립니다. 평균 30-40 초. 가능하면이 시간을 10 초로 줄이고 싶습니다. 너에게 불필요한 것이 보이니?다음 서브 루틴을 최적화하는 방법은 무엇입니까?

각 계산 및 번호 처리 단계가 필요합니다. 컴파일되지만 데이터 파일이 없으면 서브 루틴을 제대로 사용할 수 없습니다.

+0

코드? 코드없이이 질문에 대답하기가 어렵습니다. – andersoj

+1

코드를 완전히 삭제하기 위해 질문을 편집 한 이유가 무엇입니까? 원본 코드를 볼 수 있다는 것은 권장되는 최적화의 가치를 파악하는 데 중요한 부분입니다. –

답변

3
for my $index (@{$centroid_gene_exp_ref}) { 
    push(@{ $diff_y_ref }, ($index - mean($centroid_gene_exp_ref))); 
} 

이렇게하면 @{$centroid_gene_exp_ref}의 모든 항목에 대한 평균을 다시 계산합니다. 그 배열이 큰 경우, 그것은 기하 급수적으로 합쳐질 것입니다. (나는 mean()이 결과를 캐싱하거나 메모하지 않아서 호출 될 때마다 배열을 반복하도록합니다). 당신은 캐싱하여 상당한 시간을 절약 할 수있다 자신을 의미 : 그 너머

my $mean = mean($centroid_gene_exp_ref); 
for my $index (@{$centroid_gene_exp_ref}) { 
    push(@{ $diff_y_ref }, ($index - $mean)); 
} 

, 그 지점에서 실제 병목 (들) 및 대상 최적화를 찾을 Devel::NYTProf 확인하십시오.

+1

우수! 감사합니다, 그것은 대략까지 런타임을 가져 왔습니다. 5 ~ 12 초. :-) 다른 것을 볼 수 있습니까? – cooldood3490

2

당신의 계정에 당신이 %$centroids_ref의 모든 키를 compute() 전화를 보여있는 이전 포스트 복용, 더 큰 그림을 볼 필요가 있습니다 :

foreach my $key (keys %HoA) { 
    compute($HoA{$key}, \%HoA); # on the first iteration, this actually passes an aref to [1,3,3,3] 
} 

심지어 데이브 Sherohman의 최적화 후 '를 여전히 많은 계산 (예 : mean)을 계속 반복합니다.

외부 루프를 compute()에 가져 오는 것이 좋습니다. 그런 다음 HoA의 각 키에 대해 계산을 저장하고 각 키에 해당 값을 재사용 할 수 있습니다.

sub compute{ 
    my ($centroids_ref) = @_; 

    # precalculate these values once 
    my %means; 
    my %diffs; 
    my %sqrts; 
    foreach my $key (keys %$centroids_ref) { 
     my $mean = mean($centroids_ref->{$key}); 
     my @diffs = map {$_ - $mean} @{$centroids_ref->{$key}}; 

     my @squares = map {$_ * $_} @diffs; 
     my $sqrt = sqrt(sum(\@squares)); 

     $means{$key} = $mean; 
     $diffs{$key} = \@diffs; 
     $sqrts{$key} = $sqrt; 
    } 

    # now do the main calculations from the 'possible bottlenecks' section 
    ... 
} 
+0

@steveni 제안에 감사드립니다! 나는 그것을 시도 할 것이다. 위에 게시 한 서브 루틴을 제거 할 수 있습니까? 아직 오픈 소스가 될 준비가되지 않았습니다 : 0 – cooldood3490

+0

done. 그 후에 어떤 종류의 시간을 갖게되는지 알려주십시오. – stevenl

+0

고마워요. 할 것이다! 나는 이것을 나중에 구현할 것이고 당신에게 돌아갈 것이다. – cooldood3490

관련 문제