Schrift
[thread]16[/thread]

Optimieren



<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten
kabel
 2003-08-20 12:05
#987 #987
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
du meinst einen profiler wie z.b. CPAN:den hier
Benchmark ist eher zum vergleich von verschiedenen lösungen in einem skript.
-- stefan
ronald
 2003-08-20 11:44
#988 #988
User since
2003-08-15
76 Artikel
BenutzerIn
[default_avatar]
Um zu sehen, wo die Rechenzeit verbraten wird, gibt es doch auch unter perl ein Benchmark-Modul, oder?
snadra
 2003-08-20 11:43
#989 #989
User since
2003-08-11
265 Artikel
BenutzerIn
[Homepage] [default_avatar]
Na gut, bei allen macht es wahrscheinlich nichts mehr, aber schon eine weniger, macht halt eine weniger die rausgesucht werden muß, somit Zeitersparnis.
Select * muß sich auch erstmal informieren, was es überhaupt gibt, select Feld1, Feld2... weiß ja schon was es machen soll.
http://hamburg.pm.org
jeden 2. mittwoch im monat
--
#!/usr/bin/perl -w
$l=join('',map chr,(116,110,105,114,112))if$^T;
!!$$?@_=qw(Jhfg Aabgure Prey Hnpxre):$l=1;
for(@_){eval reverse($l)."'"._(_(_($_))).' \''}
sub _{$_=~y+a-z+n-za-m+and pop}
stb2050
 2003-08-20 11:31
#990 #990
User since
2003-08-14
87 Artikel
BenutzerIn
[default_avatar]
Hi Ihr,

mein Script ist saulangsam und ich hätte gerne mal ein paar Tipps zur Optimierung. Es sind zwei Scripts, die hintereinander aufgerufen werden und anscheinend Jahre brauchen.

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#!/usr/bin/perl

#Einleitung

use CGI;
use CGI::Carp qw(fatalsToBrowser);
&#36q = new CGI;

require "hpm_einstellungen.cgi";

#Username ermitteln

&#36username = &#36q->param("user");

if (&#36username eq "")
{
   &#36url = &#36ENV{REQUEST_URI};
   &#36username = (split /\//, &#36url)[-1];
}

#Prüfen, ob User vorhanden ist oder User-ID ermitteln

&#36anfrage = "SELECT userid, status FROM hpm_user WHERE username='&#36username';";
&datenbank;
&#36ergebnisse = &#36sth->fetchall_arrayref( { userid => 1, status => 1 } );
foreach(@&#36ergebnisse) { &#36userid = &#36_->{userid}; &#36status = &#36_->{status}; }

if (&#36userid eq "") { require "hpm_homepage_error404.cgi"; }

#Prüfen, ob User gesperrt ist

if (&#36status eq "4") { require "hpm_homepage_gesperrt.cgi"; }

open(FILE, "&#36internmaindir/userdaten/&#36userid/daten/homepagedaten.dat");
flock FILE,1;
@einstellungen = <FILE>;
s/\n// foreach (@einstellungen);
close(FILE);

&#36titel = &#36einstellungen[0];
&#36beschreibung = &#36einstellungen[1];
&#36design = &#36einstellungen[3];
&#36autor = &#36einstellungen[4];
&#36herausgeber = &#36einstellungen[5];
&#36copyright = &#36einstellungen[6];
&#36keywords = &#36einstellungen[7];

#Prüfen, ob Design erlaubt ist

if (!(&#36design eq "own"))
{
   open(FILE, "&#36internmaindir/userdaten/&#36userid/daten/payeddesigns.dat");
   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"; }
}

#Art und Name des Designs ermitteln

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

#Hintergrundmusik ermitteln

open(FILE, "&#36internmaindir/userdaten/&#36userid/daten/musik.dat");
flock FILE,1;
@einstellungen = <FILE>;
s/\n// foreach (@einstellungen);
close(FILE);
&#36hintergrundmusik = &#36einstellungen[0];

#Prüfen, ob Werbung angezeigt werden muss

open(FILE, "&#36internmaindir/userdaten/&#36userid/daten/funktionen.dat");
flock FILE,1;
@einstellungen = <FILE>;
s/\n// foreach (@einstellungen);
close(FILE);
&#36werbung = &#36einstellungen[6];

#Frameset ausgeben

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

if (&#36werbung eq "1")
{
   &#36anfrage = "SELECT value FROM hpm_sonstiges WHERE name='werbeart'";
   &datenbank;
   &#36ergebnisse = &#36sth->fetchall_arrayref( { value => 1 } );
   foreach(@&#36ergebnisse) { &#36werbeart = &#36_->{value}; }

   if (&#36werbeart eq "1")
   {
      require "hpm_homepage_frame.cgi";
   }
   elsif (&#36werbeart eq "2")
   {
      require "hpm_homepage_popup.cgi";
   }
}
else
{
   require "hpm_homepage_werbefrei.cgi";
}

exit();


Die hpm_homepage_frame, popup und werbefrei printen noch ein bisschen HTML-Code für ein Frameset und binden dann hpm_homepage.cgi so ein.

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
#!/usr/bin/perl

#Einleitung

use CGI;
use CGI::Carp qw(fatalsToBrowser);
&#36q = new CGI;

require "hpm_einstellungen.cgi";

#Infos einlesen

&#36userid = &#36q->param("userid");
&#36name = &#36q->param("name");
&#36page = &#36q->param("page");
&#36typ = &#36q->param("typ");
&#36var = &#36q->param("var");
&#36id = &#36q->param("id");

if (&#36page eq "") { &#36page = "index"; }

if (&#36name eq "")
{
   open(FILE, "&#36internmaindir/userdaten/&#36userid/daten/homepagedaten.dat");
   flock FILE,1;
   @einstellungen = <FILE>;
   s/\n// foreach (@einstellungen);
   close(FILE);
   &#36design = &#36einstellungen[3];

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

   if (&#36name eq "") { &#36message = "Designfehler. Bitte wenden Sie sich an den Webmaster."; &error_end; }
}

#Besucher für User zählen

open(FILE, "&#36internmaindir/userdaten/&#36userid/daten/counter.dat");
flock FILE,1;
@einstellungen = <FILE>;
s/\n// foreach (@einstellungen);
close(FILE);

&#36zahl = &#36einstellungen[0];
&#36ips = &#36einstellungen[1];

&#36userip = &#36ENV{'REMOTE_ADDR'};
(&#36datum, &#36uhrzeit) = split (/\|/, &DATUM_UHRZEIT);

if (!((grep(/&#36userip/, split(",", &#36ips))) > 0))
{
   &#36newips = "&#36userip,&#36ips";
   &#36newips = substr(&#36newips, 0, 250);

   &#36zahl++;

   open(FILE, ">&#36internmaindir/userdaten/&#36userid/daten/counter.dat");
   flock FILE,2;
   print FILE "&#36zahl\n";
   print FILE "&#36newips\n";
   close(FILE);

   open(FILE, "&#36internmaindir/userdaten/&#36userid/daten/counter_tage.dat");
   flock FILE,1;
   @tage = <FILE>;
   s/\n// foreach (@tage);
   close(FILE);

   for(0..&#36#tage)
   {
      (&#36tagdatum, &#36tagzahl) = split(/\|\|\|/, &#36tage[&#36_]);
      if (&#36tagdatum eq &#36datum) { &#36status = "ja"; &#36zeile = &#36_; &#36zahl = &#36tagzahl; }
   }

   if (&#36status eq "ja")
   {
      &#36eintraege[&#36zeile] = "&#36datum|||&#36zahl";

      open(FILE, ">&#36internmaindir/userdaten/&#36userid/daten/counter_tage.dat");
      flock FILE,2;
      foreach(@tage) { print FILE &#36_ . "\n"; }
      close(FILE);

   }
   else
   {
      open(FILE, ">>&#36internmaindir/userdaten/&#36userid/daten/counter_tage.dat");
      flock FILE,2;
      print FILE "&#36datum|||1\n";
      close(FILE);
   }

   #Aufruf der Homepage für System zählen

   &#36anfrage = "SELECT value FROM hpm_sonstiges WHERE name='counter_homepages';";
   &datenbank;
   &#36ergebnisse = &#36sth->fetchall_arrayref( { value => 1 } );
   foreach(@&#36ergebnisse) { &#36inhalt = &#36_->{value}; }

   @content = split/OOO/, &#36inhalt;

   (&#36countdatum, &#36countzahl) = split(/\|\|\|/, &#36content[0]);

   &#36countzahl++;
   &#36content[0] = "&#36countdatum|||&#36countzahl";

   &#36newinhalt = "";
   foreach(@content) { &#36newinhalt .= &#36_ . "OOO"; }

   &#36anfrage = "UPDATE hpm_sonstiges SET value='&#36newinhalt' WHERE name='counter_homepages'";
   &datenbank;
}

#Prüfen, ob Intro angezeigt werden soll oder nicht

open(FILE, "&#36internmaindir/userdaten/&#36userid/daten/intro.dat");
flock FILE,1;
@einstellungen = <FILE>;
s/\n// foreach (@einstellungen);
close(FILE);
&#36showit = &#36einstellungen[0];

if ((&#36showit eq "0") || (&#36showit eq "") || (!(&#36id eq ""))  || (!(&#36page eq "index")))
{
   #Intro nicht anzeigen

   if (&#36name eq "own")
   {
      print "Location: designs/benutzer.cgi?page=&#36page&typ=&#36typ&id=&#36id&userid=&#36userid&var=&#36var\n\n";
   }
   else
   {
      print "Location: designs/&#36name/index.cgi?page=&#36page&typ=&#36typ&id=&#36id&userid=&#36userid&var=&#36var\n\n";
   }
}
elsif (&#36showit eq "1")
{
   #Intro anzeigen

   #Richten Link für Weiterleitung generieren

   if (&#36name eq "own")
   {
      &#36weiterlink = "&#36homedir/designs/benutzer.cgi?page=&#36page&typ=&#36typ&id=&#36id&userid=&#36userid&var=&#36var";
   }
   else
   {
      &#36weiterlink = "&#36homedir/designs/&#36name/index.cgi?page=&#36page&typ=&#36typ&id=&#36id&userid=&#36userid&var=&#36var";
   }

   #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";

   if (&#36form eq "1")
   {
      #Grafik-Tag

      print "    <p><img border=\"0\" src=\"&#36maindir/userdaten/&#36userid/bilder/&#36grafik\"></p>\n";
   }
   elsif (&#36form eq "2")
   {
      #Flash-Tag

      print "    <p>\n";
      print "    <object width=\"&#36width\" height=\"&#36height\">\n";
      print "    <param name=\"movie\" value=\"&#36maindir/userdaten/&#36userid/flash/&#36flash\">\n";
      print "    <param name=\"loop\" value=\"false\">\n";
      print "    <param name=\"quality\" value=\"&#36quali\">\n";
      print "    <param name=\"menu\" value=\"false\">\n";
      print "    <embed src=\"&#36maindir/userdaten/&#36userid/flash/&#36flash\" width=\"&#36width\" height=\"&#36height\" loop=\"false\" quality=\"&#36quali\" menu=\"false\" border=\"0\" type=\"application/x-shockwave-flash\" pluginspace=\"http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash\"></embed>\n";
      print "    </object>\n";
      print "    <p>\n";
   }

   print "    <p><font face=\"&#36button_schriftart\" size=\"&#36button_schriftgroesse\"><a target=\"_self\" href=\"&#36weiterlink\"><font>&#36button_text</font></a></font></p>\n";
   print "    </td>\n";
   print "  </tr>\n";
   print "</table>\n";
   print "</body>\n";
   print "</html>\n";
}

exit();


Hmm ich denke mal ich habe da ne Menge uneffektiv programmiert.

Viele Grüße
Steffen\n\n

<!--EDIT|snadra|1061376157-->
snadra
 2003-08-20 11:36
#991 #991
User since
2003-08-11
265 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich habe Dein Script jetzt nur überflogen, aber was mir sofort auffiel sind Deine SQL Abfragen.
Du solltest nie 'select *' verwenden, sondern immer nur die Felder angeben, die Du brauchst, selbst wenn es sich dabei um fast alle oder alle handelt.
Also: 'select FELD1, FELD2, FELD3 from'.
select * ist immer langsamer und kann bei großen Tabellen, bzw. Tableen mit vielen Datensätzen, zu akuten Performance Problemen führen.
http://hamburg.pm.org
jeden 2. mittwoch im monat
--
#!/usr/bin/perl -w
$l=join('',map chr,(116,110,105,114,112))if$^T;
!!$$?@_=qw(Jhfg Aabgure Prey Hnpxre):$l=1;
for(@_){eval reverse($l)."'"._(_(_($_))).' \''}
sub _{$_=~y+a-z+n-za-m+and pop}
Crian
 2003-08-20 11:39
#992 #992
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ist das auch so, wenn man alle bis auf eine Spalte haben möchte, oder sogar, wenn man wirklich alle Spalten will? Das klingt dann aber nach einem Fehler in der Datenbank, oder?
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
Crian
 2003-08-20 11:41
#993 #993
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ich habe den Thread mal ins CGI-Forum verschoben.
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
Dubu
 2003-08-20 13:18
#994 #994
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Ich hab's auch nur so ueberflogen, aber wenn ich das richtig sehe, wird evtl. mehrfach die Routine datenbank() aufgerufen, die wohl jedesmal Connect und Abfrage macht, und sowas braucht natuerlich ewig. Abgesehen davon, dass mir bei dieser Methode schaudert, den SQL-String durch eine globale Variable zu uebergeben...
SirLant
 2003-08-20 14:40
#995 #995
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
editiere dein posting mal bitte und ersetze die code-tags durch perl-tags (statt code einfach perl reinschreiben)
Mit Syntax-Highlighting liest es sich viel besser :)

Aber folgende Regeln solltest du beachten beim Arbeiten mit einem DBMS:
-Nur Einmal am Anfang zur DB verbinden und das DB-Handle allen Routinen übergeben
-Nur die Spalten auswählen die du auch wirklich benötigst

Und sonst:
-keine globalen Variablen, immer Referenzen(wegen dem Speicherplatz) übergeben
--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!
snadra
 2003-08-20 14:43
#996 #996
User since
2003-08-11
265 Artikel
BenutzerIn
[Homepage] [default_avatar]
habe die Tags gerade dreist editiert. Bei so langen Code Stücken ist der perl tag wirklich schöner...
http://hamburg.pm.org
jeden 2. mittwoch im monat
--
#!/usr/bin/perl -w
$l=join('',map chr,(116,110,105,114,112))if$^T;
!!$$?@_=qw(Jhfg Aabgure Prey Hnpxre):$l=1;
for(@_){eval reverse($l)."'"._(_(_($_))).' \''}
sub _{$_=~y+a-z+n-za-m+and pop}
<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten



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