Schrift
[thread]8268[/thread]

Scalar performanter auswerten?



<< >> 7 Einträge, 1 Seite
Gast Gast
 2006-08-25 14:42
#69205 #69205
Hallo Zusammen,
ich habe mir einen Paket Sniffer für die Netzwerkkarte programmiert, z. T. mit tollen Routinen aus cpan.org.
Leider lässt die Performance meines Scriptes wünsche offen...
Ich befürchte das ich den Script durch RegExp, welche ich zum Paket Filtern verwende, ausbremse.

Dies sieht dann ca. wie folgt aus:


Code: (dl )
1
2
3
4
5
6
7
8
$packet = <Inhalt eines Paketes eben>
$packet= unpack('H32',$packet);
if ($packet =~ m/^.......(.)../) {
$interesantesBit=$1;
if ($interesantesbyte=="0") {print "nicht gesetzt"};
if ($interesantesbyte=="A") {print "Es ist mittelwert"};
if ($interesantesbyte=="F") {print "Es ist auf max"};
};


Welche ansätze fallen euch ein, um die Perfomance zu steigern?
Gruß Bernd
nepos
 2006-08-25 14:55
#69206 #69206
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Dein Problem wird vor allem sein, dass du auch wenn der 1. Test ok war alle folgenden trotzdem auswertest.
Das waere wohl eher ein Fall fuer ein Elsif-Konstrukt.
Das Splitten vom Paket koennte man eventuell mit split eventuell auch effektiver machen.
BungeeBug
 2006-08-25 15:11
#69207 #69207
User since
2004-03-16
54 Artikel
BenutzerIn
[default_avatar]
Oder das CPAN Modul CPAN:Switch ... mit Sicherheit die beste Loesung fuer eine Auswertung wie diese.\n\n

<!--EDIT|BungeeBug|1156504336-->
MfG
BungeeBug
Ronnie
 2006-08-25 16:06
#69208 #69208
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
substr ist wahrscheinlich effektiver als ein regulärer Ausdruck.\n\n

<!--EDIT|Ronnie|1156507655-->
Thorium
 2006-08-25 16:06
#69209 #69209
User since
2003-08-04
232 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=BungeeBug,25.08.2006, 13:11]Oder das CPAN Modul CPAN:Switch ... mit Sicherheit die beste Loesung fuer eine Auswertung wie diese.[/quote]
Falsch
Switch ist hundelangsam.

Du solltest für solche operationen reguläre ausdrücke vermeiden. Mach dir besser einwenig mehr Aufwand mit substr oder einigen binären Operatoren...
Vorallem solltest du substr auch vor unpack verwenden um nur das Byte zu holen, was du auch wirklich brauchst. Danach kannst du unpacken und evt. nochmal substr verwenden.

Auf jedenfall solltest du Benchmark verwenden...\n\n

<!--EDIT|Thorium|1156507758-->
Per|li|nist der; -en, -en <zu ↑...ist>: a) Anhänger, Vertreter der radikalen Perlinisten die Perl als die einzig wahre Sprache ansehen; b) Mitglied einer perlinistischen Community.
Crian
 2006-08-25 16:51
#69210 #69210
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Wenns um die If-Geschchte geht:

Einmal außerhalb definieren:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
my %byte_text = (
'0' => 'nicht gesetzt',
'1' => 'niedrig',
'2' => 'niedrig',
'3' => 'niedrig',
'4' => 'niedrig',
'5' => 'niedrig',
'6' => 'niedrig',
'7' => 'mittelniedrig',
'8' => 'mittelniedrig',
'9' => 'mittelniedrig',
'A' => 'Es ist mittelwert',
'B' => 'mittelhoch',
'C' => 'mittelhoch',
'D' => 'hoch',
'E' => 'hoch',
'F' => 'Es ist auf max',
);


und dann in der Schleife nur noch

Code: (dl )
print $byte_text{$interessantesbyte};
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Taulmarill
 2006-08-25 16:52
#69211 #69211
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
<klugscheiss> ausserdem sollte man zum vergleichen von stings eq und nicht == verwenden. </klugscheiss>

die schnellste möglichkeit für solche switch-artigen konstrukte dürfte ein hash-lookup sein
Code: (dl )
1
2
3
4
5
6
my %byte = ( 
0 => "nicht gesetzt",
A => "Es ist mittelwert",
F => "Es ist auf max",
);
print $byte{ $interessantes_byte };

natürlich geht das für komplexere vergleiche nicht mehr, dann sollte man das if-elsif-else konstrukt verwenden, was nepos schon beschrieb.

edit: mist, da war der Crian schneller ;-)\n\n

<!--EDIT|Taulmarill|1156510398-->
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
<< >> 7 Einträge, 1 Seite



View all threads created 2006-08-25 14:42.