Announcement

Collapse
No announcement yet.

for-Schleifen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • for-Schleifen

    Seit Delphi 5 optimiert der Compiler for-Schleifen wenn es egal ist ob die Schleife aufwaerts oder abwaerts zaehlt. Abwaerts-Zaehlen gibt effizienteren Code

  • #2
    for-Schleifen

    Hallo,
    kann es sein, das Delphi 6 bei einigen for-Schleifen nach dem Muster for i := 1 to 10 rückwärts zählt?

    MfG Jan

    Comment


    • #3
      Hi,

      for/next Schleifen konnten schon immer in beide Laufrichtungen verwendet werden.

      Gruß
      Gesin

      Comment


      • #4
        Hallo Jan

        die Antwort ist JA, denn dummerweise geht es nur runter explizit mit downto

        Das bedeutet, dass ich immer while verwende und inc(i) wenn ich sicher aufwärtszählende Schleifen benötige

        gruss Bernhar

        Comment


        • #5
          Hallo Bernhard,
          ich glaube Jan meinte was anderes. Auch wenn du eingibst
          for i := 1 to 20 do ...
          dann optimiert Delphi diesen Code, da für den Compiler das Abwärtszählen schneller geht. Das geschieht aber nur intern und nur, wenn der Code diese Optimierung zulässt.
          Ach so, nicht nur seit D6 ist das Problem bekannt. Ist aber keines, da eine for-Schleife ja auch nur angibt, wie oft si durchlaufen werden soll.

          mf

          Comment


          • #6
            oder anders ausgedrückt: entstehen durch die Zählrichtung einer Zählschleife in der Schleife selber Abhänigkeiten, so daß eben die Zählrichtung der Schleife von Bedeutung ist, dann optimiert der Compiler die Zählrichtung nicht. der Compiler macht also intelligent das was eigentlich der Programmierer machen würde wenn er schnellere Zählschleifen coden wollte.

            Ich persönlich halte das also keineswegs für ein "problem" sondern eher für ein sehr nützliches Feature der Codeoptimierung. In einigen NewsGroups habe ich ähnliche Diskussionen gesehen und konnte leider das eigentliche Problem was viele Coder haben nicht erkennen. Diese Optimierungen sind seit langem integrierte Funktionalität jedes besseren Compilers, egal ob C,C++,PASCAL oder BASIC.

            Der Fakt ist das man in Assmbler eigentlich NUR mit solchen implizieten Zählschleifen arbeitet da eben das Decrement einer Zahl bei Erreichen von NULL oder -1 die CPU Flags entsprechend setzt. Die Auswertung ob eine Zählschleife NULL erreicht hat kommt also mit einem Decrement Befehl und einer Flag-Abfrage aus. Ansonsten benötigte man ein Increment + ein Vergleichs- + ein Flag-Abfrage Befehl. Verlangsamend kommt hinzu das diese Abfrage meistens als Kopfschleife durchgeführt wird und die meistens CPU's aber eine sogenannte Branchprediction "Sprung-zieladressen-Wahrscheinlichkeits-Berechnungs-Funktion" besitzen. Leider ist die meistens "backward" orientiert, funktioniert also nur bei Fuß-Schleifen. D.h. eine CPU kann bei einer Fußschleife noch bevor die eigentliche Abfrage stattfindet mit hoher Wahscheinlichkeit den korrekten Code aus dem Speicher in den Cache laden, und das alles parallel zum eigentlich gerade auszuführenden machinencode.<br>
            Damit sind also die fußgesteuerten, dekrementierenden Zählschleifen, also vergleichbar mit repeat until, die schnellsten Schleifen.

            Gruß hage

            Comment


            • #7
              Hallo alle zusammen,

              ich habe noch mal in die Handbücher gesehen und folgende interessante Sache gefunden. In einer for-Schleife prüft Delphi die Variablen nur beim Eintritt ab, anschließend nicht wieder. Also ist dieses for .. to nur wichtig für die Anzahl, wie oft diese Schleife durchlaufen werden soll. Demzufolge ist es auch egal, in welche Richtung. Wer jetzt natürlich folgenden Konstrukt verwendet, der hat natürlich Probleme (hausgemachte):
              <pre>
              MyText := '12/34';
              for i := 1 to length(MyText) do begin
              if MyText[i] = '/' then delete(MyText,i,1);
              end;
              </pre>
              Da length(MyText) nur am Anfang überprüft wird, wird die Schleife tatsächlich fünf mal durchgeführt, der letzte Wert MyText[5] zeigt irgendwo hin. Das kann natürlich Fehler produzieren.
              Wer so etwas machen will, MUSS eine While-Schleife verwenden!!!

              mfg Klaus-Pete

              Comment


              • #8
                oder eben for I := Length() downto 1 d

                Comment


                • #9
                  Jo,

                  mfg Klaus-Pete

                  Comment

                  Working...
                  X