Net::Dict schneller machen

Net::Dict schneller machen

am 06.10.2006 14:00:12 von Helmut Wollmersdorfer

In 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

Re: Net::Dict schneller machen

am 06.10.2006 15:09:17 von Thomas Wittek

Helmut Wollmersdorfer schrieb:
> Wo kann hier Geschwindigkeit geholt werden?

Schau dir mal das Modul Devel::FastProf an:
http://search.cpan.org/~salva/Devel-FastProf-0.05/

Das zeigt dir, in welchen Zeilen die meiste Zeit verbraten wird.

Ich bin nicht ganz durchgestiegen, wie das genau ausgeführt und geme=
ssen
wird. Ein nicht unerheblicher Overhead besteht aber darin, den
Perl-Interpreter zu starten und den Code zu kompilieren.
Das würdest du dir sparen, wenn du z.B. mod_perl oder FastCGI nutzen=

würdest.

--=20
Thomas Wittek
http://gedankenkonstrukt.de/
Jabber: streawkceur@jabber.i-pobox.net

Re: Net::Dict schneller machen

am 06.10.2006 15:41:25 von Helmut Wollmersdorfer

Thomas Wittek wrote:

> Schau dir mal das Modul Devel::FastProf an:
> http://search.cpan.org/~salva/Devel-FastProf-0.05/

> Das zeigt dir, in welchen Zeilen die meiste Zeit verbraten wird.

> Ich bin nicht ganz durchgestiegen, wie das genau ausgeführt und gemessen
> wird.

Scheint den Source zu zerlegen und 'eval' zu machen, wodurch grosser
Overhead erzeugt wird.

> Ein nicht unerheblicher Overhead besteht aber darin, den
> Perl-Interpreter zu starten und den Code zu kompilieren.

Messe ich aber nicht mit, weil meine Time-Stamps danach erfolgen.

> Das würdest du dir sparen, wenn du z.B. mod_perl oder FastCGI nutzen
> würdest.

Das ist der nächste Schritt, und mod_perl hätte wohl den Effekt, dass
die Informationen, welche ich mit den langsamen Funktionen 'dbs' und
'strategies' einlese, gecacht werden können, weil sie sich nur ca.
wöchentlich ändern.

Helmut Wollmersdorfer