我有一個工作perl腳本,它可以掃描一個目錄並使用imgsize http://dktools.sourceforge.net/imgsize.html來獲取png文件的寬度等。有沒有人有加快這個過程的任何提示(現在,每1000個文件平均5分鐘)?我只是想知道如果代碼可以優化一些如何。謝謝。在perl中加速foreach循環
use strict;
use warnings;
use File::Find;
my @files;
my $directory = '/Graphics/';
my $output_file = '/output_file';
my $max_height = 555;
my $count = 0;
open (OUTPUT, '>>', $output_file);
find(\&wanted, $directory);
foreach my $file (@files) {
if ($file =~ /\.png$/) {
my $height = `imgsize $file | cut -d\'\"\' -f4`;
if ($height > $max_height) {
print OUTPUT "$file\n";
}
$count++;
my $int_check = $count/1000;
if ($int_check !~ /\D/) {
print "processed: $count\n";
}
}
}
print "total: $count\n";
close (OUTPUT);
exit;
sub wanted {
push @files, $File::Find::name;
return;
}
解決方案:原來我是能夠使用Image::Info
模塊。我從每5分鐘處理1000張圖片到每12秒。以下是相關的代碼片段,如果有人感興趣:
use Image::Info qw(image_info);
foreach my $file (@files) {
if ($file =~ /\.png$/) {
my $output = image_info($file);
my $height = ${$output}{height};
if ($height > $max_height) {
print OUTPUT "$file\n";
}
$count++;
my $int_check = $count/1000;
if ($int_check !~ /\D/) {
print "processed: $count\n";
}
}
}
你是否描述過腳本? [DeveL :: NYTProf](http://p3rl.org/Devel::NYTProf)非常適合分析。 – choroba
我假設瓶頸是'imgsize'應用程序。你可以嘗試並行運行多個實例。見例如[Parallel :: ForkManager](http:// p3rl/Parallel :: ForkManager) – ElPaco
謝謝@choroba我會研究一下。 –