Paul: Schleifen

Moin,
kann man allgemein sagen was schneller ist?

Entweder:

Schleifenanfang {
  Suche
  If gefunden {
    Schleife {
      Verarbeiten
      Ausgeben
    }
   }
}
oder:

Schleifenanfang {
  Suche
}

If gefunden {
  Schleife {
    Verarbeiten
    Ausgabe
  }
}

Im ersten Fall läuft die If-Abfrage in der Schleife (bei mir ca 15000 mal) mit durch. Wenn etwas gefunden wurde wird eine weitere Schleife angestoßen (läuft bei mir ca. 10000 mal).
Im zweiten Fall läuft die zweite Schleife außerhalb der ersten.

Besten Dank,
Paul

  1. Hi Paul,

    kann man allgemein sagen was schneller ist?

    Allgemein kann man da nicht wirklich was zu sagen - lediglich vermuten, ich würde dir empfehlen für beide Vorschläge ein Programm zu schreiben und einen Benchmark Test durchzuführen.

    Noch eine grundsätzliche Anmerkung - es sieht mir hier so aus, als würde deine Suche nur eine Sache finden (sonst wäre das zweite Beispiel nämlich unlogisch), deshalb...

    Schleifenanfang {
      Suche
      If gefunden {
        Schleife {
          Verarbeiten
          Ausgeben
        }

    solltest du hier mit break die Schleife abbrechen,
          da sonst die äußere Schleife noch weiter läuft, obwohl
          das Gesuchte bereits gefunden wurde.

    }
    }

    Wenn du so ein Abbrechen der Schleife mit einbaust, dann wird auch klar, dass dieser Code...

    Schleifenanfang {
      Suche
    }

    ... unter Umständen weniger performant sein kann, da hier auf jeden Fall alle Zustände durchlaufen werden (wie du sagst 15000), mit einem Break kann die Schleife u.U. schon nach dem 1. Durchlauf abgebrochen werden, weil direkt im ersten Durchlauf alles gefunden wurde.

    Wenn du eine Suche realisieren willst, solltest du dir aber grundsätzlich überlegen, ob du nicht irgendwie einen Index anlegen kannst oder willst - das würde die Suche nämlich je nach dem deutlich beschleunigen.

    In vielen Programmiersprachen bietet sich z.B. die Möglichkeit Werte in einem indexierten Array abzulegen, dann kann man über $array['index'] direkt auf ein bestimmtes Element zugreifen und muss es nicht erst suchen.

    Wenn deine Originaldaten sich nicht auf diese Art und Weise strukturieren lassen, kannst du dir überlegen, ob es sich lohnt ein Array anzulegen, welches unter den bestimmten (zu suchenden) Werten auf das Original-Array verweist (Referenzen bzw. Zeiger). So ein Array zur Laufzeit zu generieren würde sich aber auf keinen Fall rentieren, das müsstest du schon irgendwo zwischenspeichern, damit du immer drauf zugreifen kannst und es lediglich regelmäßig aktualisieren.

    Aber ich bin sicher, Google kann dir da mehr und vor allem konkretere Sachen nenne, als ich ;-)

    Viele Grüße aus Kanada,
      ~ Dennis.

    1. Moin ( => gute Nacht) Dennis,
      vielen Dank für die ausführliche Antwort!

      Noch eine grundsätzliche Anmerkung - es sieht mir hier so aus, als würde deine Suche nur eine Sache finden »»

      Leider nicht. Die Anzahl der gefundenen Werte ist nicht vorherzusagen.

      Wenn du eine Suche realisieren willst, solltest du dir aber grundsätzlich überlegen, ob du nicht irgendwie einen Index anlegen kannst oder willst - das würde die Suche nämlich je nach dem deutlich beschleunigen.

      In vielen Programmiersprachen bietet sich z.B. die Möglichkeit Werte in einem indexierten Array abzulegen, dann kann man über $array['index'] direkt auf ein bestimmtes Element zugreifen und muss es nicht erst suchen.

      Das hört sich gut an. Man sollte einfach mal vorher überlegen aber bei uns ist es noch dunkel draußen &-]

      Paul

  2. hi,

    Schleifenanfang {
      Suche
      If gefunden {
        Schleife {
          Verarbeiten
          Ausgeben
        }
       }
    }

    Wird in diesem Fall in der inneren Schleife nur der gerade gefundene Datensatz ausgegeben?

    Schleifenanfang {
      Suche
    }

    If gefunden {
      Schleife {
        Verarbeiten
        Ausgabe
      }
    }

    Werden hier im zweiten Teil nur die zuvor gefundenen Datensätze ausgegeben, oder alle?

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Moin,

      Wird in diesem Fall in der inneren Schleife nur der gerade gefundene Datensatz ausgegeben?

      Jupp.

      Werden hier im zweiten Teil nur die zuvor gefundenen Datensätze ausgegeben, oder alle?

      Nur die gefundenen.

      Allerdings versuch ich gerade eine bessere Lösung unter verwendung von einem Index (siehe Dennis) einzubauen.

      Paul

      1. hi,

        Werden hier im zweiten Teil nur die zuvor gefundenen Datensätze ausgegeben, oder alle?

        Nur die gefundenen.

        Kennzeichnest du diese also schon beim Suchen irgendwie, oder musst du dann die Suche erneut durchführen, um zu entscheiden, ob du einen Datensatz ausgibst?

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }