From d07b38eed1044b3b88876a53b8e5870386f38a20 Mon Sep 17 00:00:00 2001 From: minima Date: Sun, 5 Nov 2000 11:59:24 +0000 Subject: [PATCH] made a dramatic speedup on sh/dx with reduction of memory --- Changes | 2 ++ cmd/show/dx.pl | 40 +++++++++++++++++++++++++++------------- perl/Spot.pm | 41 +++++++++++++++++++++++++++++++++++------ 3 files changed, 64 insertions(+), 19 deletions(-) diff --git a/Changes b/Changes index 4fbc514f..5ba84843 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,5 @@ +05Nov00======================================================================= +1. 75% speed up on sh/dx !, lower memory usage as well! 04Nov00======================================================================= 1. fix sh/filter so ity now works for any callsign (and not just connected ones). diff --git a/cmd/show/dx.pl b/cmd/show/dx.pl index b10ee7cd..675fb8d0 100644 --- a/cmd/show/dx.pl +++ b/cmd/show/dx.pl @@ -18,6 +18,7 @@ my $pre; my $spotter; my $info; my $expr; +my $hint; my ($doqsl, $doiota, $doqra); while ($f = shift @list) { # next field @@ -87,64 +88,77 @@ while ($f = shift @list) { # next field if ($pre) { $pre .= '*' unless $pre =~ /[\*\?\[]/o; $pre = shellregex($pre); - $expr = "\$f1 =~ m{$pre}o"; -} else { - $expr = "1"; # match anything + $expr = "\$f1 =~ m{$pre}"; + $pre =~ s/\^//; + $hint = "m{\U$pre}"; } # now deal with any frequencies specified if (@freq) { $expr .= ($expr) ? " && (" : "("; + $hint .= ($hint) ? " && (" : "("; my $i; for ($i = 0; $i < @freq; $i += 2) { $expr .= "(\$f0 >= $freq[$i] && \$f0 <= $freq[$i+1]) ||"; + my $r = Spot::ftor($freq[$i], $freq[$i+1]); + $hint .= "m{$r} ||" if $r; } - chop $expr; - chop $expr; + chop $expr; chop $expr; + chop $hint; chop $hint; $expr .= ")"; + $hint .= ")"; } # any info if ($info) { $expr .= " && " if $expr; $info =~ s{(.)}{"\Q$1"}ge; - $expr .= "\$f3 =~ m{$info}io"; + $expr .= "\$f3 =~ m{$info}i"; + $hint .= " && " if $hint; + $hint .= "m{$info}i"; } # any spotter if ($spotter) { $expr .= " && " if $expr; $spotter = shellregex($spotter); - $expr .= "\$f4 =~ m{$spotter}o"; + $expr .= "\$f4 =~ m{$spotter}"; + $hint .= " && " if $hint; + $hint .= "m{$spotter}"; } # qsl requests if ($doqsl) { $expr .= " && " if $expr; - $expr .= "\$f3 =~ m{(\@|>|QSL|VIA)}io"; + $expr .= "\$f3 =~ m{QSL|VIA}i"; + $hint .= " && " if $hint; + $hint .= "m{QSL|VIA}i"; } # iota requests if ($doiota) { $expr .= " && " if $expr; - $expr .= "\$f3 =~ m{$doiota}io"; + $expr .= "\$f3 =~ m{$doiota}i"; + $hint .= " && " if $hint; + $hint .= "m{$doiota}i"; } # iota requests if ($doqra) { $expr .= " && " if $expr; - $expr .= "\$f3 =~ m{$doqra}io"; + $expr .= "\$f3 =~ m{$doqra}i"; + $hint .= " && " if $hint; + $hint .= "m{$doqra}io"; } #print "expr: $expr from: $from to: $to fromday: $fromday today: $today\n"; # now do the search -my @res = Spot::search($expr, $fromday, $today, $from, $to); +my @res = Spot::search($expr, $fromday, $today, $from, $to, $hint); my $ref; my @dx; foreach $ref (@res) { - @dx = @$ref; - push @out, Spot::formatl(@dx); + push @out, Spot::formatl(@$ref); } return (1, @out); diff --git a/perl/Spot.pm b/perl/Spot.pm index 9c10796b..74e4e27a 100644 --- a/perl/Spot.pm +++ b/perl/Spot.pm @@ -23,7 +23,7 @@ use vars qw($fp $maxspots $defaultspots $maxdays $dirprefix $duplth $dupage $fil $fp = undef; $maxspots = 50; # maximum spots to return $defaultspots = 10; # normal number of spots to return -$maxdays = 35; # normal maximum no of days to go back +$maxdays = 365; # normal maximum no of days to go back $dirprefix = "spots"; $duplth = 20; # the length of text to use in the deduping $dupage = 3*3600; # the length of time to hold spot dups @@ -158,7 +158,7 @@ sub add sub search { - my ($expr, $dayfrom, $dayto, $from, $to) = @_; + my ($expr, $dayfrom, $dayto, $from, $to, $hint) = @_; my $eval; my @out; my $ref; @@ -174,6 +174,8 @@ sub search @todate = Julian::sub(@fromdate, $dayto); $from = 0 unless $from; $to = $defaultspots unless $to; + $hint = $hint ? "next unless $hint" : ""; + $expr = "1" unless $expr; $to = $from + $maxspots if $to - $from > $maxspots || $to - $from <= 0; @@ -184,6 +186,11 @@ sub search # build up eval to execute $eval = qq( + while (<\$fh>) { + $hint; + chomp; + push \@spots, [ split '\\^' ]; + } my \$c; my \$ref; for (\$c = \$#spots; \$c >= 0; \$c--) { @@ -207,10 +214,6 @@ sub search my $fh = $fp->open(@now); # get the next file if ($fh) { my $in; - while (<$fh>) { - chomp; - push @spots, [ split '\^' ]; - } eval $eval; # do the search on this file last if $count >= $to; # stop after to return ("Spot search error", $@) if $@; @@ -220,6 +223,32 @@ sub search return @out; } +# change a freq range->regular expression +sub ftor +{ + my ($a, $b) = @_; + return undef unless $a < $b; + $b--; + my @a = split //, $a; + my @b = split //, $b; + my $out; + while (@b > @a) { + $out .= shift @b; + } + while (@b) { + my $aa = shift @a; + my $bb = shift @b; + if ($aa eq $bb) { + $out .= $aa; + } elsif ($aa < $bb) { + $out .= "[$aa-$bb]"; + } else { + $out .= "[$bb-$aa]"; + } + } + return $out; +} + # format a spot for user output in 'broadcast' mode sub formatb { -- 2.43.0