Entry tags:
попытка упрощения кода
столкнулся с неким кодом, который имплементирует итератор по ip адресам:
авторский код (удалены несущественные куски):
а теперь мое:
сравнение скорости:
1. авторский код:
Real: 32.73s User: 32.44s System: 0.09s Percent: 99%% Cmd: perl -MIPRange -e
2. мой код:
Real: 31.66s User: 31.36s System: 0.08s Percent: 99%% Cmd: perl -MIPRange -e
изменились только размеры кода
use IPRange;
my $ip = new IPRange ("254.1.1.1", "254.30.254.254");
while ($ip->next) {
print $ip->value,"\n";
}
авторский код (удалены несущественные куски):
package IPRange;
sub new {
my $check = shift;
my $self = { };
bless( $self, $class );
my $start = shift || "1.1.1.1";
my $last = shift || "255.255.255.255";
$self->{ START } = $start;
$self->{ LAST } = $last;
$self->{ VALUE } = '';
$self->{ BORD } = 0;
$self->{ DONE } = 0;
$self->{ STARTED } = 0;
return $self;
}
sub value {
my $self = shift;
if (@_) { $self->{ VALUE } = shift; }
return $self->{ VALUE };
}
sub next {
my $self = shift;
if ( !$self->{ STARTED } )
{
if ( !$self->{ VALUE } ) { $self->{ VALUE } = $self->{ START } }
$self->{ STARTED } = 1;
return $self->{ START };
}
if ( !$self->{ DONE } )
{
my @four=split(/\./, $self->{ VALUE });
$four[3]++;
if ( $self->{ BORD } )
{
if ($four[3]==256) { $four[2]++; $four[3]=0; }
if ($four[2]==256) { $four[1]++; $four[2]=0; }
if ($four[1]==256) { $four[0]++; $four[1]=0; }
if ($four[0]==256) { return 0; }
}
if ( !$self->{ BORD } )
{
if ($four[3]==255) { $four[2]++; $four[3]=1; }
if ($four[2]==255) { $four[1]++; $four[2]=1; }
if ($four[1]==255) { $four[0]++; $four[1]=1; }
if ($four[0]==255) { return 0; }
}
$self->{ VALUE }=join('.', @four);
if ($self->{ LAST } eq $self->{ VALUE }) { $self->{ DONE } = 1; }
} else { return 0; }
return $self;
}
1;
а теперь мое:
package IPRange;
sub new ($$$) {
my ($class,$begin,$end) = @_;
return bless { 'begin' => $begin,'end' => $end,'first' => 1 },$class;
}
sub next ($) {
my $self = shift;
return if ($self->{'begin'} eq $self->{'end'});
if ($self->{'first'}) {
$self->{'first'} = 0;
return $self->{'begin'};
}
my @ip = reverse split "\\.",$self->{'begin'};
foreach (@ip) {
if (++$_ == 256) { $_ = 0; }
else { last; }
}
return $self->{'begin'} = join ".",reverse @ip;
}
sub value ($) {
return $_[0]->{'begin'};
}
1;
сравнение скорости:
1. авторский код:
Real: 32.73s User: 32.44s System: 0.09s Percent: 99%% Cmd: perl -MIPRange -e
2. мой код:
Real: 31.66s User: 31.36s System: 0.08s Percent: 99%% Cmd: perl -MIPRange -e
изменились только размеры кода