Schrift
[thread]10368[/thread]

Hilfe bei Code-Optimierung benötigt...



<< >> 9 Einträge, 1 Seite
Magic
 2007-09-11 12:33
#99307 #99307
User since
2003-09-30
91 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo zusammen,
ich bräuchte mal Hilfe bei der Optimierung eines Codestückes. Und zwar möchte ich gern diese Routine:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
sub getTemplate {
# first argument is the templatefile other arguments are still keys
my ( $template_file, @keys ) = @_;
my ( $temp_file, @t );

local ($/);
open( TMP, $template_file )
|| warn "Can´t open template $template_file ( $! )";
$temp_file = <TMP>;
close TMP;

if ( @keys ) {
for( @keys ){
my ($tpl) = $temp_file =~ /<!--$_-->(.*?)<!--$_-->/s;
$tpl = 'TEMPLATE ERROR' if !$tpl;
push ( @t, $tpl );
}
return @t;
}

return $temp_file;
}

ein wenig schneller bekommen, falls das überhaupt geht. Hat jemand ne Idee wie und ob man da überhaupt was tunen kann? Bin auch gern für andere Vorschläge offen.

Grüße,
Stefan
Ein Weiser gibt nicht die richtigen Antworten, sondern er stellt die richtigen Fragen.
renee
 2007-09-11 12:53
#99309 #99309
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Verwende CPAN:HTML::Template::Compiled ;-)

Erkläre bitte mal ganz grob, was das Ziel der Sub ist. Ist es gewollt, dass Du immer nur das erste Vorkommen eines "keys" berücksichtigst? Sollen evtl. alle Vorkommen von "keys" berücksichtigt werden?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
sid burn
 2007-09-11 12:59
#99310 #99310
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Hast du vorher auch geschaut ob diese Subroutine ausschlaggebend ist für eine Optimierung? Also hast du mit Profilern das überprüft?

Unabhängig von deinem Code, wenn du eine Subroutine hast die bei gleichen Übergabeparamtern immer das selbe Ergebniss liefern kannst du das Modul "memoize" nutzen. Dies fügt einen Cache zu deiner Subroutine hinzu. Ein schlüssel zur Performanceverbesserung ist es, einmal berechnete Sachen nur einmal berechnen zu lassen und das Ergebnis dann abzuspeichern. Das Modul memoize erledigt soetwas für dich.

Wenn eine Antwort von einer Subroutine nur für eine bestimmte Zeit gültig sein soll gibt es auch Das Modul Memoize::Expire.


Ansonsten unabhängig von der Performance würde ich immer die 3-argumenten form von open() nutzen, und weiterhin lexikalische Variablen nutzen. also soetwas hier:
Code (perl): (dl )
open TMP, $tmpfile ....

in soetwas umwandeln:
Code (perl): (dl )
open my $tmp, '<', $tmpfile ....



Ansonsten wie Renee bereits anmerkte würde ich ein bereits vorhandees Template Module nehmen:
HTML:Template
Template::Toolkit
HTML:Template::Compiled
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
moritz
 2007-09-11 13:01
#99311 #99311
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Die Regex ist sicher optimierbar:
Code: (dl )
/<!--$_-->(.*?)<!--$_-->/s;

Wenn der ersten Teil matched und der zweite nicht, wird über jede mögliche Länge von .* gebacktrackt.
Wenn du keine HTML-Tags in (.*?) zulassen willst, macht [^<]* das ganze sehr viel effizienter.

Wenn doch... schwierig. Du könntest probieren mit (?>...) was zu reissen, aber das hängt davon ab, was du genau erlauben willst.

Die andere Frage ist: Hast du deinen Code mal durch einen Profiler gejagt, um zu schauen, ob diese Funktion wirklich das ist, was viel Zeit frisst?
Und was spricht gegen ein "fertiges" Templating-System wie CPAN:HTML::Template::Compiled, CPAN:HTML::Template oder CPAN:Template?
Magic
 2007-09-11 15:02
#99325 #99325
User since
2003-09-30
91 Artikel
BenutzerIn
[Homepage] [default_avatar]
Erstmal danke für die schnellen Antworten und noch einige Infos zu dieser Routine.
Ich habe dieses Template-System damals deshalb eingeführt, weil ich etwas leichtes und schnelles haben wollte, was immer und überall einsetzbar ist, ohne Module installieren zu müssen. Naja, und weil es nun mal schnell zu implementieren ist und man sich sooooo schnell dran gewöhnt, habe ich halt nicht weiter drüber nachgedacht und es immer wieder mal verwendet.
So sind halt die Templates auf dieses System zugeschnitten.
Unter anderem auch in meinem Shop-System, dass mittlerweile den "kleinen" Rahmen vom Anfang ganz gewaltig gesprengt hat ( Beispiel: http://www.stevens-fashion.de/ ).
Naja, und nun bin ich halt auf der Suche nach Optimierungen.
Da mir diese Sub schon immer ein Dorn im Auge war, wollte ich halt hier ansetzen, vor allem, da sie unter Umständen bis zu 4 oder 5 mal pro Programmaufruf aufgerufen wird und Templates zurückliefern soll.
Mein aktuellster Ansatz für die Optimierung war, das eingelesene Templatefile für die gesamte Programmlaufzeit im Speicher zu halten, statt es am Routinen-Ende wieder zu verwerfen.
Da man aber selbst die besten Lösungsansätze oft übersieht oder aus unwissenheit unter eigenen Ideen verbuddelt, wollte ich mal hier Anfragen.

Grüße,
Stefan
Ein Weiser gibt nicht die richtigen Antworten, sondern er stellt die richtigen Fragen.
pq
 2007-09-11 15:14
#99326 #99326
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Magic+2007-09-11 13:02:15--
Ich habe dieses Template-System damals deshalb eingeführt, weil ich etwas leichtes und schnelles haben wollte, was immer und überall einsetzbar ist, ohne Module installieren zu müssen. Naja, und weil es nun mal schnell zu implementieren ist und man sich sooooo schnell dran gewöhnt, habe ich halt nicht weiter drüber nachgedacht und es immer wieder mal verwendet.

so fängt es immer an, bei jedem templating-system. irgendwann ärgert man sich, dass es
kein UNLESS kann, dann, dass es kein ELSIF kann, dann, dass es keine LOOPs kann, dann,
dass man keine vernünftige verschachtelung der parameter haben kann, usw.
es ist für jeden entwickler ein graus, in einem neuen job anzufangen und schon wieder ein
neues templating zu lernen, was schon wieder so vieles nicht kann.

zum leidigen theme "ohne Module installieren zu müssen": module sind auch nur dateien,
zumindest, wenn es sich um pures Perl handelt. wenn du ein skript "installieren" kannst,
kannst du auch ein modul installieren. installieren heißt nämlich in dem fall einfach nur dateien
kopieren. Wiki:ModuleWieInstalliereIchEinModul
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Magic
 2007-09-11 17:52
#99343 #99343
User since
2003-09-30
91 Artikel
BenutzerIn
[Homepage] [default_avatar]
pq+2007-09-11 13:14:12--
zum leidigen theme "ohne Module installieren zu müssen": module sind auch nur dateien,
zumindest, wenn es sich um pures Perl handelt. wenn du ein skript "installieren" kannst,
kannst du auch ein modul installieren. installieren heißt nämlich in dem fall einfach nur dateien
kopieren. Wiki:ModuleWieInstalliereIchEinModul


Kommt immer aufs Modul an. Eineige Module müssen auf dem Hostsystem kompiliert werden *klugscheiß ;o)

Grüße,
Stefan
Ein Weiser gibt nicht die richtigen Antworten, sondern er stellt die richtigen Fragen.
sid burn
 2007-09-11 18:01
#99344 #99344
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Was für ein OS nutzt du den? Bei fast allen Bestriebssystemen die ich kenne gibt es bereits fertige Packete der gängigen Template Module.

Selbst für Windows gibt es PPM womit du nciht selber Kompilieren brauchst.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
pq
 2007-09-11 19:06
#99349 #99349
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Magic+2007-09-11 15:52:49--
pq+2007-09-11 13:14:12--
zum leidigen theme "ohne Module installieren zu müssen": module sind auch nur dateien,
zumindest, wenn es sich um pures Perl handelt. wenn du ein skript "installieren" kannst,
kannst du auch ein modul installieren. installieren heißt nämlich in dem fall einfach nur dateien
kopieren. Wiki:ModuleWieInstalliereIchEinModul


Kommt immer aufs Modul an. Eineige Module müssen auf dem Hostsystem kompiliert werden *klugscheiß ;o)

ich sagte "wenn es sich um pures Perl handelt". (dann gibt es noch die ausnahme Autoloader)
wenn schon klugscheißen, dann bitte richtig
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< >> 9 Einträge, 1 Seite



View all threads created 2007-09-11 12:33.