"Extremes" Laufzeitproblem - ein get-Block über 80% der Gesamtlaufzeit - baseportal Forum - Web-Anwendungen einfach, schnell, leistungsfähig!
baseportal
English - Deutsch "Es gibt keine dummen Fragen - jeder hat einmal angefangen"

 baseportal-ForumDie aktuellsten 10, 30, 50, 100 Einträge anzeigen.  

 
 Ausgewählter Eintrag: Zur Liste 
    Beitrag von hempelr (1976 Beiträge) am Mittwoch, 29.Juni.2005, 12:54.
    "Extremes" Laufzeitproblem - ein get-Block über 80% der Gesamtlaufzeit

      Hab da ein ziemliches Laufzeitproblem (relativ - momentan im Web noch nicht in absoluten Werten problematisch).
      Eine kleine DB mit Orten, Ortsteilen und Zusatzinfos mit insgesamt momentan ca. 150 DS, über alles 21 Feldern, davon 6 indiziert (alles einfache Textfelder bzw. ein Datumsfeld) wird einmal komplett durchlaufen, im While_get_next erfolgen einige Auswertungen und bedingte Hashwertbelegungen sowie eine "rekursive" Relation auf einen aktuellen Datensatzuwert zum Ort (alle zugehörigen Ortsteile werden geholt) innerhalb derer dann einfach eine kleine Berechnung stattfindet.

      Nun ist die Laufzeit dieses kleinen Blockes im Moment schon bei 0,22 Sekunden (im Web) - mein Lokaler Webserver braucht dazu 1,8 Sekunden - die Laufzeit des Restes des Templates macht dann trotz eines weiteren get-Blockes auf eine andere DB weniger als 0,05 Sekunden aus.

      Was könnte dafür verantwortlich sein - ich poste hier mal den betreffenden Code-Teil:
      ---schnipp
      # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -#
      # Hash mit Einwohnerzahlen bauen / Liste mit Ortsnamen bauen
      $get1start = runtime();
      $a_debug.= "Einwohnerzahlen holen / Liste f. Kommunennamen bauen (ohne Ortsteile)<br>";
      get "k_kommune==*", "kommunen", "holeorte";
      while(get_next("holeorte")){
         $neu_ort = $ort_temp ne $k_kommune ? 1 : 0; # Flag für neue Kommune
         push @l_orte, $k_kommune if $neu_ort; # Liste mit eindeutigen Ortsnamen bauen
         if ($neu_ort){ # wenn neuer Ort Ortsteile holen
          my $ort = $k_kommune;
            $ort =~ s/ /\\ /g;
          my ($zahl_ew_o, $zahl_ew_ot,$zahl_ew,$cnt_ot);
          get "k_kommune==$ort", "kommunen", "holewz";
          my $anz_ort = $_amount_query;
          while(get_next("holewz")){
             # EW-Zahl wenn kein Ortsteil und EW-Zahl > 0
             $zahl_ew_o = $k_einwohner if $k_ortsteil eq "" && $k_einwohner > 0;
             # EW-Zahl addieren, wenn Ortsteil und EW-Zahl vorhanden
             $zahl_ew_ot += $k_einwohner if $k_ortsteil ne "" && $k_einwohner > 0;
             # $cnt_ot++ if $k_einwohner > 0 && $k_ortsteil ne "";
          } # E while_get_next
            # EW-Zahl in Hash speichern, entweder Summe Ortsteile oder Gesamtort
          $zahl_ew = $zahl_ew_o >= $zahl_ew_ot ? $zahl_ew_o : $zahl_ew_ot;
          $h_ewzahl{$ort} = $zahl_ew if $zahl_ew > 0; # Hashkey-wertpaar nur wenn EW-Zahl in DB vorh.
         } # E if
         $ort_temp = $k_kommune;
      } # E while_get_next
      $get1ende = runtime();
      $get1lz = f_zahl(${\($get1ende-$get1start)},3);
      #. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .#
      
      ---schnapp
      Der Link ist hier - aber vorsicht, ist Baustelle, kann immer mal anders aussehen ;-) - Laufzeiten ziemlich weit unten in der Debugausgabe.
      http://bapos.de/exec/baseportal.pl?htx=/wsolar/auswertung_liga&use=list

      Wäre mir sehr wichtig, da später eine Ortsdb mit mehreren tausend Orten benutzt werden soll...vielleicht ist ja auch mein DB-Design vollkommen daneben, für Hinweise wäre ich sehr dankbar


    Antworten

 Alle Einträge zum Thema: Zur Liste 
    Beitrag von hempelr (1976 Beiträge) am Mittwoch, 29.Juni.2005, 12:54.
    "Extremes" Laufzeitproblem - ein get-Block über 80% der Gesamtlaufzeit

      Hab da ein ziemliches Laufzeitproblem (relativ - momentan im Web noch nicht in absoluten Werten problematisch).
      Eine kleine DB mit Orten, Ortsteilen und Zusatzinfos mit insgesamt momentan ca. 150 DS, über alles 21 Feldern, davon 6 indiziert (alles einfache Textfelder bzw. ein Datumsfeld) wird einmal komplett durchlaufen, im While_get_next erfolgen einige Auswertungen und bedingte Hashwertbelegungen sowie eine "rekursive" Relation auf einen aktuellen Datensatzuwert zum Ort (alle zugehörigen Ortsteile werden geholt) innerhalb derer dann einfach eine kleine Berechnung stattfindet.

      Nun ist die Laufzeit dieses kleinen Blockes im Moment schon bei 0,22 Sekunden (im Web) - mein Lokaler Webserver braucht dazu 1,8 Sekunden - die Laufzeit des Restes des Templates macht dann trotz eines weiteren get-Blockes auf eine andere DB weniger als 0,05 Sekunden aus.

      Was könnte dafür verantwortlich sein - ich poste hier mal den betreffenden Code-Teil:
      ---schnipp
      # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -#
      # Hash mit Einwohnerzahlen bauen / Liste mit Ortsnamen bauen
      $get1start = runtime();
      $a_debug.= "Einwohnerzahlen holen / Liste f. Kommunennamen bauen (ohne Ortsteile)<br>";
      get "k_kommune==*", "kommunen", "holeorte";
      while(get_next("holeorte")){
         $neu_ort = $ort_temp ne $k_kommune ? 1 : 0; # Flag für neue Kommune
         push @l_orte, $k_kommune if $neu_ort; # Liste mit eindeutigen Ortsnamen bauen
         if ($neu_ort){ # wenn neuer Ort Ortsteile holen
          my $ort = $k_kommune;
            $ort =~ s/ /\\ /g;
          my ($zahl_ew_o, $zahl_ew_ot,$zahl_ew,$cnt_ot);
          get "k_kommune==$ort", "kommunen", "holewz";
          my $anz_ort = $_amount_query;
          while(get_next("holewz")){
             # EW-Zahl wenn kein Ortsteil und EW-Zahl > 0
             $zahl_ew_o = $k_einwohner if $k_ortsteil eq "" && $k_einwohner > 0;
             # EW-Zahl addieren, wenn Ortsteil und EW-Zahl vorhanden
             $zahl_ew_ot += $k_einwohner if $k_ortsteil ne "" && $k_einwohner > 0;
             # $cnt_ot++ if $k_einwohner > 0 && $k_ortsteil ne "";
          } # E while_get_next
            # EW-Zahl in Hash speichern, entweder Summe Ortsteile oder Gesamtort
          $zahl_ew = $zahl_ew_o >= $zahl_ew_ot ? $zahl_ew_o : $zahl_ew_ot;
          $h_ewzahl{$ort} = $zahl_ew if $zahl_ew > 0; # Hashkey-wertpaar nur wenn EW-Zahl in DB vorh.
         } # E if
         $ort_temp = $k_kommune;
      } # E while_get_next
      $get1ende = runtime();
      $get1lz = f_zahl(${\($get1ende-$get1start)},3);
      #. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .#
      
      ---schnapp
      Der Link ist hier - aber vorsicht, ist Baustelle, kann immer mal anders aussehen ;-) - Laufzeiten ziemlich weit unten in der Debugausgabe.
      http://bapos.de/exec/baseportal.pl?htx=/wsolar/auswertung_liga&use=list

      Wäre mir sehr wichtig, da später eine Ortsdb mit mehreren tausend Orten benutzt werden soll...vielleicht ist ja auch mein DB-Design vollkommen daneben, für Hinweise wäre ich sehr dankbar

     Antworten

    Beitrag von Pouraga (1396 Beiträge) am Mittwoch, 29.Juni.2005, 22:55.
    Re: "Extremes" Laufzeitproblem - ein get-Block über 80% der Gesamtlaufzeit

      Naja das kann schon hin kommen
      je nach dem wie viele Datensätze das innere get holt, können diese Geschachtelten abfragen schon seine zeit dauern (sind ja schon über 100 einzelne db Abfragen).

      Sowas ist generell möglichst zu vermeiden. Ich kenne den Aufbau deiner db jetzt leider nicht.
      Du solltest aber alle arten von berechnungen und umsortieren vermeiden. Jeder Datensatz selber sollte für seine Ausgabe alles enthalten.
      d.h.
      In jedem Datensatz stehen Einwohnerzahl Sortierung etc.
      So muss bei der Ausgabe nicht erst alles zusammengesucht werden.
      Komplizierte berechnungen und umsortieren wird nur einmal bei änderung für den einen ds durchgeführt (oder fals doch mal was durcheinadner kommen kann mit einem eigenen reorg template für alle)

      Das kann zwar eine etwas grössere Datenbank produzieren (was selten ein Problem ist) spart aber enorm zeit bei der Ausgabe.
       
      Nen schönes beispiel für so eine Struktur ist z.B. dieses Forum, jeder datensatzt kennt seine vertikale position und wie weit er eingerückt ist.
      Wenn die einrücktiefe erst bei der Ausgabe berechnet werden müsste, würde das einen unverhältnissmässigen Rechenaufand bedeuten. Und die Laufzeit für jede Anzeige um ein vielfaches grösser sein.

     Antworten

    Beitrag von hempelr (1976 Beiträge) am Donnerstag, 30.Juni.2005, 08:25.
    Re: "Extremes" Laufzeitproblem - ein get-Block über 80% der Gesamtlaufzeit

      Danke Pouraga für die Erläuterungen.
      Naja - in der inneren Schleife werden maximal 5 Durchläufe stattfinden (es gibt momentan nicht mehr als 5 Ortsteile für einen Ort)
      Nun ist das Problem aber insgesamt doch noch etwas "komplexer" und mir fehlt im Moment die richtige Idee, wie das anzupacken ist...
      Aber egal, ich weiss erst mal vom Ansatz her, wo ich suchen und schrauben muss...
      CU

     Antworten


     
 Liste der Einträge von 23700 bis 23850:Einklappen Zur Eingabe 
Neueste Einträge << 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | Neuere Einträge < Zur Eingabe  > Ältere Einträge | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 >> Älteste Einträge


Zurück zur Homepage

© baseportal.de. Alle Rechte vorbehalten. Nutzungsbedingungen



powered in 0.06s by baseportal.de
Erstellen Sie Ihre eigene Web-Datenbank - kostenlos!