Net::Dict schneller machen
am 06.10.2006 14:00:12 von Helmut WollmersdorferIn einem Perl-cgi verwende ich Net::Dict und ich würde gern an die
Geschwindigkeit des in C geschriebenen dict-Clients herankommen.
Zum Vergleich (jeweils mehrere Aufrufe, um Caching-Effekte auszuschliessen):
$ time dict -S > temp
real 0m0.010s
user 0m0.000s
sys 0m0.004s
# ----- get strategies from the server
$strat_time = time;
my %strategies = $dict->strategies();
$strat_time = time - $strat_time;
Total time 0.132 seconds (new 0.008, init 0.081 [dbs 0.041, strat
0.039], def 0.042)
'strat' dauert über Net::Dict also 4-mal so lang wie über den
Console-Client. Damit jetzt niemand auf die Idee kommt, den
Console-Client mittels Pipe zu verwenden: das ist noch _viel_ langsamer.
So schaut der relevante Code in Net::Dict aus:
package Net::Dict;
use strict;
use IO::Socket;
use Net::Cmd;
use Carp;
use vars qw(@ISA $VERSION $debug);
$VERSION = sprintf("%d.%02d", q$Revision: 2.7 $ =~ /(\d+)\.(\d+)/);
[...]
sub strategies
{
@_ == 1 or croak 'usage: $dict->strategies()';
my $self = shift;
return 0
unless $self->_SHOW_STRAT();
my(%strats, $name, $desc);
foreach (@{$self->read_until_dot()})
{
($name, $desc) = (split /\s/, $_, 2);
chomp $desc;
$strats{$name} = _unquote($desc);
}
$self->getline();
%strats;
}
[...]
sub _SHOW_STRAT { shift->command('SHOW STRAT')->response() == CMD_INFO }
[...]
sub _unquote
{
my $string = shift;
if ($string =~ /^"/)
{
$string =~ s/^"//;
$string =~ s/"$//;
}
return $string;
}
Wo kann hier Geschwindigkeit geholt werden?
Kann die Zuweisung auf ein Hash
my %strategies = $dict->strategies();
soviel Unterschied ausmachen?
Bei 'define' wird eine Referenz auf ein Array zurückgegeben
my $eref = $dict->define($in{'Query'});
und der Unterschied zum Console-Client ist wesentlich geringer (0.042 zu
0.033).
Eigentlich gehören die Funktionen 'dbs' und 'strategies' laut 'perldoc
Net::Dict' eh seit Ewigkeiten auf Array umgeschrieben:
KNOWN BUGS AND LIMITATIONS
Need to add methods for getting lists of databases and strategies in
the order theyâre returned by the remote server.
TIA
Helmut Wollmersdorfer