如何優化這個 Perl 腳本?
它接收 "一周的日子",如 "星期一和星期二 "或 "星期三、星期四和星期日",并簡單地回傳一個整數來表示它們。
use strict;
use feature qw(signatures);
使用警告。
no warnings qw( experimental::signatures);
my $DAYS_OF_WEEK_LOOKUP = ( { mon =>/span> 1, tue => 2, wed => 4, thu => 8, fri => 16, sat => 32, sun => 64 })。)
my $days_of_week_integer= days_of_week_to_int (['zz', 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'fri', 'SAT'])。)
print "$days_of_week_integer
"。
sub days_of_week_to_int ($days) /span>{
my $day_of_week = 0;
foreach my $key(@$days) {
$day_of_week = $DAYS_OF_WEEK_LOOKUP->{lc($key)} if $DAYS_OF_WEEK_LOOKUP-> {lc($key)};
}
return $day_of_week if $day_of_week < 128;
return;
}
我一直想了解如何更好地優化我的代碼,并從經驗豐富的開發人員那里獲得經驗。這個腳本運行得非常好,而且它是用Perl撰寫的,所以它的運行速度已經非常快了。
然而,我不禁覺得有一種更優化的 "Perl方式 "來實作同樣的結果,我想知道是否有人有同樣的感覺,并能為我指明方向。小提示是重要的提示!
謝謝大家,我在這里添加了最后的代碼和基準。這是我的原始代碼,剝離了額外的開銷,但忠實于原始的北極熊代碼。
use strict;
use benchmark ':all';
my $polar_bitmap = 0x01;
my @polar_days_of_week = qw/Mon Tue Wed Thu Fri Sat Sun/; # USA/Canada week days ordermy $orig_DAYS_OF_WEEK_LOOKUP = ( { Mon =>/span> 1, Tue => 2, Wed => 4, Thu => 8, Fri => 16, Sat => 32, Sun => 64 })。)
my %polar_DAYS_OF_WEEK_LOOKUP = map { $_ => ( $polar_bitmap <<= 1 ) / 2 } @polar_days_of_week;
my @days;
@days = qw/Mon Wed Tue Sat Sun Thu/;
print "orig : " . (orig_days_of_week_to_int(@days)) . "
"。
print "polar : " . (polar_days_to_mask ( @days)) . "
"。
@days = qw/Mon Sat Sun Thu/;
print "polar : " . (polar_days_to_mask(@days)) . "
"。
print "orig : " . (orig_days_of_week_to_int(@days)) . "
"。
@days = qw/Mon Wed Tue Sat Sun Thu/;
cmpthese(-3, {
orginal => sub { orig_days_of_week_to_int(@days) },
polar_b => sub { polar_days_to_mask(@days) },
});
exit 0;
sub polar_days_to_mask{
my $days = shift;
my $mask;
$mask ^= $polar_DAYS_OF_WEEK_LOOKUP{$_}。for @$days;
return $mask;
}
sub orig_days_of_week_to_int{
my @days = @_;
my $day_of_week = 0;
foreach my $key(@days) {
$day_of_week = $orig_DAYS_OF_WEEK_LOOKUP-> {$key};
}
return $day_of_week;
}
還有輸出:
orig : 111
極地 : 111
極地 : 105
起源 : 105
速率 orginal polar_b
原始的1411082/s --41%。
polar_b 2398719/s 70% --
我在上面添加了代碼,以防我搞砸了什么,因為你總是要小心使用BenchMarks! :-)
為了證明上述觀點...... 我想我應該用我的一個LINODE節點來測驗它......
為了證明上述觀點,我想用我的一個LINODE節點來測驗它。
Rate orginal polar_b
orginal 741061/s --25%。
polar_b 992490/s 34% --
實際上,與我家里的HP裸機相比......LINODE給我的印象是34%,而我家里的機器是70%。 (相同的作業系統,相同的版本)
所以,你是......要對基準測驗保持警惕!
不管怎么說,部分人、部分熊、部分人工智能,極地的解決方案是酷的。uj5u.com熱心網友回復:
我沒有做過任何基準測驗,但我認為這樣更干凈(評論中的注釋):
標籤: 下一篇:如何在for回圈中組合嵌套的字典
#!/usr/bin/env perl
use strict;
使用警告。
use experimental qw/signatures/; # Instead of use feature and no warnings[/span
use feature qw/say/;
use List::Util qw/sum0/;
# Plain hash instead of hashref.
my
