PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl: Gibts "Stringbuffer"?



SeeksTheMoon
24-01-2006, 22:49
Ich habe Scripts die in Schleifen zeilenweise Text von Datenbankabfragen als html-Code für eine Webseite ausgeben.
Das ist teilweise seehr lahm. Lohnt es sich, die Texte erstmal in einen Buffer zu schreiben und dann diesen komplett auszugeben?

z.B. mit Text::Buffer immer appenden und dann nur ein print?

baumgartner
25-01-2006, 08:06
du kannst den ganzen text auch in einer Variable speichern und dann ausgeben, dies bewirkt bei größeren Datenmengen einen mehr mehr als spürbaren performancegewinn

<alt>
print "zeile 1\n"
print "zeile 2\n"
</alt>

<neu>
$output .= "zeile1\n"
$output .= "zeile2\n"
print $output
</neu>

ich hoffe da meintest das so :)

mfg martin

SeeksTheMoon
25-01-2006, 11:25
so habe ich das schon umgeschrieben. Ist das denn genauso schnell wie diese Buffer-Klassen?

baumgartner
25-01-2006, 15:51
du sagst du machst in schleifen datenbankabfragen?

also ich hab jetzt ein script hier angepasst dass es statt 24 mysqlabfragen nur noch eine macht. Dadurch entstand ein performance gewinn vom fakor 10.

also hier mal ein bsp:

du willst alle kunden von denen noch geld ausständig ist
<alt>
select name, gerät from kunden were bezahlt=0 and shortname=hk
</alt>

<neu>
select name, gerät from kunden where bezahlt = 0
while ....
$hash{$name}=$gerät
</neu>

TYI, ist jetzt nur ein beispiel. :)

Durch diese möglichkeit ruft die schleife nicht ständig einen neuen prozess auf wodurch der kernel nicht jedes mal die ressourcen neu verteilen muss und......

mfg martin

SeeksTheMoon
25-01-2006, 20:15
ich mach die Abfrage vorher und dann die HTML-Ausgabe für jeden Datensatz in einer Schleife.
bzw. anstatt der Ausgabe schreibe ich die Ausgabe in einen String mit .= Verknüpfung und gebe nach der Schleife diesen String aus.

baumgartner
25-01-2006, 23:22
kannst du mal quellcode herzeigen?

SeeksTheMoon
26-01-2006, 08:26
na wie ichs schreibe ;)


$sth=$dbh->prepare("fetter sql befehl mit joins etc");
$sth->execute;
my $ausgabevar="";
while (($g) = $sth->fetchrow_array) {
$g=~s/^acct2(\w+)$/\1/;
$ausgabevar.= '<INPUT TYPE="CHECKBOX" NAME="AccZone" VALUE="'.$g.',"';
if ($Formular{AccZone}=~m/(^|,)$g(,|$)/){
$ausgabevar.= " CHECKED";
}
$Formular{AccZone}=~m/(^|,)$g(,|$)/ || undef($ALLZONESHACK);
$ausgabevar.= ">$g<BR>\n";
}
print "$ausgabevar</TD><TD>";
$ausgabevar="";

baumgartner
26-01-2006, 10:02
der bremsende faktor ist hier nicht die ausgabe sondern die Regex-ausdrücke!

--schnipp--
if ($Formular{AccZone}=~m/(^|,)$g(,|$)/){
-----
if ($Formular{AccZone} eq "|,".$g.",|"
--schnapp--

btw: benötigst du $1 und $2 wirklich?