Schrift
[thread]16[/thread]

Optimieren (Seite 2)



<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten
SirLant
 2003-08-20 14:49
#997 #997
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
Was mir hier gerade auffällt, benutze für das doch einen Hash, dann musst du die Daten nicht extra rüberkopieren und du weißt immernoch was darin steht:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#Intro ausgeben

  &#36form = &#36einstellungen[1];
  &#36grafik = &#36einstellungen[2];
  &#36flash = &#36einstellungen[3];
  &#36quali = &#36einstellungen[4];
  &#36width = &#36einstellungen[5];
  &#36height = &#36einstellungen[6];
  &#36hintergrund_farbe = &#36einstellungen[7];
  &#36hintergrund_bild = &#36einstellungen[8];
  &#36button_text = &#36einstellungen[9];
  &#36button_schriftgroesse = &#36einstellungen[10];
  &#36button_schriftart = &#36einstellungen[11];
  &#36button_schriftfarbe = &#36einstellungen[12];

  print "Content-type: text/html\n\n";

  print "<html>\n";
  print "<head></head>\n";
  print "<body text=\"&#36button_schriftfarbe\" bgcolor=\"&#36hintergrund_farbe\" background=\"&#36hintergrund_bild\" link=\"&#36button_schriftfarbe\" vlink=\"&#36button_schriftfarbe\" alink=\"&#36button_schriftfarbe\">\n";
  print "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" height=\"100%\">\n";
  print "  <tr>\n";
  print "    <td width=\"100%\" align=\"center\">\n";
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
Strat
 2003-08-20 15:28
#998 #998
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
zusaetzlich koenntest du es auch noch perl-maessig ein klein wenig schneller machen (macht zwar nicht viel aus):
1. Da du die OOP-CGI-Syntax verwendest, kannst du auf den Exporter verzichten:
use CGI (); # no namespace pollution

2. my $q = CGI::->new();

3. $username = (split /\//, $url)[-1];
da koennte
($username) = $url =~ /\/([^\/]+)$/;
schneller sein

4. Du hast folgende Struktur:
Code (perl): (dl )
1
2
3
4
5
6
if (!(&#36design eq "own")) {
}
if (&#36design eq "own") {
}
else {
}

da besser zusammenfassen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#Art und Name des Designs ermitteln

if (&#36design eq "own")
{
  &#36name = "own";
}
else
{
  open(FILE, "&#36internmaindir/userdaten/&#36userid/daten/payeddesigns.dat") or FEHLERABFRAGE;
  flock FILE,1;
  @designs = <FILE>;
  s/\n// foreach (@designs);
  close(FILE);
  foreach(@designs) { if (&#36_ eq &#36design) { &#36found = "ja"; } }
  if (!(&#36found eq "ja")) { require "hpm_homepage_designnn.cgi"; }

  &#36anfrage = "SELECT name FROM hpm_designs WHERE designid='&#36design'";
  &datenbank;
  &#36ergebnisse = &#36sth->fetchall_arrayref( { name => 1 } );
  foreach(@&#36ergebnisse) { &#36name = &#36_->{name}; }
}


5. s/\n// foreach (@designs);
schneller ist: chomp(@designs); wenn nur die Zeilenumbrueche am Ende weggeworfen werden sollen

6. open (FH, $filename);
wieso machst du da keine fehlerabfrage? bist du 100% sicher, dass das immer gut geht (auch in 5 jahren?)
Code (perl): (dl )
1
2
3
unless (open (FH, &#36filename)) {
  die "Error: couldn't read '&#36filename': &#36!\n";
}

oder so aehnlich

das sind so die Sachen, die mir perl-maessig aufgefallen sind. Ich empfehle dir sehr, mit use warnings und use strict zu entwickeln, weil du dir viel zeit bei der Fehlersuche sparst...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Strat
 2003-08-20 15:45
#999 #999
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Nebenbei: den Sinn der Zeile
foreach(@$ergebnisse) { $werbeart = $_->{value}; }
verstehe ich nicht ganz... kann man da nicht auf die foreach-schleife verzichten? z.b:
$werbeart = $ergebnisse->[-1]->{value}; ?
oder besser:
Code (perl): (dl )
1
2
3
if (my &#36ergebnis = &#36sth->fetchall_arrayref( { value => 1 } )) {
  if (&#36ergebnis->[0]->{value} == 1)
  ...

Nebenbei:
Zeichenketten vergleicht man mit eq ne lt gt ...
Zahlen vergleicht man mit == != < > ...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
ronald
 2003-08-20 16:55
#1000 #1000
User since
2003-08-15
76 Artikel
BenutzerIn
[default_avatar]
statt
Code (perl): (dl )
1
2
3
4
5
6
7
&#36titel = &#36einstellungen[0];
&#36beschreibung = &#36einstellungen[1];
&#36design = &#36einstellungen[3];
&#36autor = &#36einstellungen[4];
&#36herausgeber = &#36einstellungen[5];
&#36copyright = &#36einstellungen[6];
&#36keywords = &#36einstellungen[7];


schreibt ich lieber
Code (perl): (dl )
my (&#36titel, &#36beschreibung, undef, &#36design, &#36autor, &#36herausgeber, &#36copyright, &#36keywords) = @einstellungen;


1. sieht man sofort, dass ein Element nicht verwendet wird.

und 2. kann man in perl mit $[ den Anfangs-Index eines Arrays neu definieren.

Insbesondere wenn ich perl-Module schreibe, die von Kollegen verwendet werden können, ist es besser, nicht mit Indizes zu arbeiten. Man weiss ja nie, was die lieben Kollegen mit $[ so alles anstellen (oder gar andere (CPAN-)Module)!!\n\n

<!--EDIT|ronald|1061384179-->
kmonster
 2003-08-21 14:01
#1001 #1001
User since
2003-08-20
33 Artikel
BenutzerIn
[default_avatar]
use strict;
Ishka
 2003-08-21 13:59
#1002 #1002
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
[quote=kabel,20.08.2003, 10:05]du meinst einen profiler wie z.b. CPAN:den hier
Benchmark ist eher zum vergleich von verschiedenen lösungen in einem skript.[/quote]
Benchmark ist auch dafür gedacht, um zu sehen, wo das Programm Zeit braucht.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
Strat
 2003-08-21 14:25
#1003 #1003
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
@Ishka: wo ein Programm Zeit braucht und Ansaetze fuer Optimierungen bietet, finde ich mit CPAN:Devel::DProf heraus. Wenn ich dann die Stelle lokalisiert habe und eine wahrscheinlich schnellere Alternative gecoded habe, verwende ich CPAN:Benchmark zum ueberpruefen, ob sie ueberhaupt schneller ist, und wenn ja, wieviel (wobei da das Hauptproblem ist, dass man die Benchmarks moeglichst realitaetsnah gestalten soll, damit sie was bringen; z.B. kann es sonst passieren, dass ein Quicksort bei fuenf Elementen einer Liste langsamer ist als ein Bubblesort)\n\n

<!--EDIT|Strat|1061461530-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
stb2050
 2003-08-21 15:25
#1004 #1004
User since
2003-08-14
87 Artikel
BenutzerIn
[default_avatar]
Hi Ihr,

danke für eure Vorschläge. Werde ich gleich mal alles ändern.

Habe allerdings die Vermutung, dass das große Problem an anderer Stelle liegt.

Und zwar in der Versetzen-Datei:

Dabei erhält der Arrray @content jede Menge HTML-Code, in dem dann Variablen ersetzt werden:

foreach(@content)
{
$_ =~ s/\[counter\]/$counter/g;
$_ =~ s/\[nachname\]/$nachname/g;
$_ =~ s/\[name\]/$name/g;
$_ =~ s/\[strasse\]/$strasse/g;
$_ =~ s/\[hausnummer\]/$hausnummer/g;
$_ =~ s/\[umfrage_frage\]/$umfrage_frage/g;
$_ =~ s/\[umfrage_antwort1\]/$umfrage_antwort1/g;
$_ =~ s/\[umfrage_antwort2\]/$umfrage_antwort2/g;
$_ =~ s/\[umfrage_antwort3\]/$umfrage_antwort3/g;
$_ =~ s/\[umfrage_antwort4\]/$umfrage_antwort4/g;
$_ =~ s/\[umfrage_antwort5\]/$umfrage_antwort5/g;
}

Ich denke mal, dass das jede Menge Rechenzeit in Anspruch nimmt, oder? Vor allem, wenn das Ganze 100 mal in der Minuten gemacht wird.

Viele Grüße
Steffen
Ishka
 2003-08-21 15:39
#1005 #1005
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Also mit
my %substhash=(counter=>\$counter,...);

for(@content){
s/\[(.*?)\]/subst($1)/ge;
}

sub subst
{
return ${$substhash{$_[0]}} if exists $substhash{$_[0]};
return $_[0];
}

bist du schonmal viel schneller.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
stb2050
 2003-08-22 14:57
#1006 #1006
User since
2003-08-14
87 Artikel
BenutzerIn
[default_avatar]
Hi Ihr,

habe jetzt mal alles übernommen und hat wirklich etwas gebracht. Danke Euch.

Habe jetzt eine neue Fehlermeldung

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
&#36anfrage = "SELECT passwort, userid FROM hpm_user WHERE username='&#36user';";
&datenbank;
if (&#36ergebnisse = &#36sth->fetchall_arrayref( { userid => 1, passwort => 1 } ))
{
   &#36pass2 = &#36ergebnisse->[-1]->{passwort}; #27
   &#36userid = &#36ergebnisse->[-1]->{userid};
}
else
{
   &#36message = "Der von Ihnen eingegebene Benutzername ist nicht vorhanden.";
   &error_back;
}


Wenn hier ein Benutzer einen "$user" angibt, von dem es in der Tabelle hpm_user keine Zeile gibt, also der nicht existiert, dann bekomme ich folgende Fehlermeldung:

Quote
Modification of non-creatable array value attempted, subscript -1 at /homepages/46/d75401864/htdocs/web293/cgi-bin/login/login.cgi line 27.


Wenn es den Benutzer gibt, ist alles okay. Wo liegt hier denn das Problem?

Viele Grüße
Steffen\n\n

<!--EDIT|stb2050|1061549970-->
<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten



View all threads created 2003-08-20 12:05.