Delphi-PRAXiS
Seite 4 von 9   « Erste     234 56     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   for-Schleife gegen über while-Schleife (https://www.delphipraxis.net/131246-schleife-gegen-ueber-while-schleife.html)

omata 21. Mär 2009 17:56

Re: for-Schleife gegen über while-Schleife
 
Das ist wirklich unwichtig, weil man niemals selber optimieren soll. Das ist das oberste Gebot im Compilerbau, optimiere niemals selbst. Dein Einwand ist doch nun wirklich super speziell. Ausnahmen bestätigen immer die Regel und die ist nunmal ganz einfach. Das ist genauso wie die Diskussion über die nicht zur strukturierten Programmierung gehörenden Befehle wie exit, break, continue, goto, label, ...
Die kann man bestimmt auch mal sinnvoll einsetzten, keine Frage, aber deshalb setzte ich sie nicht ständig ein. Sondern ich verwende sie vielleicht bei 1Mio. Programmzeilen 0,5mal. Ich habe sie noch nie in irgendeiner Anwendung benötigt, außer das exit, zu debug Zwecken.

Chemiker 21. Mär 2009 18:07

Re: for-Schleife gegen über while-Schleife
 
Hallo,

ich benutze die Schleife die das Problem am Schnellsten löst (für den Programmier). Sollte die Schleife zu einem schlechten Laufzeit verhalten führen, so muss an der Stelle eine Nachbesserung erfolgen. Vielleicht Denke ich da auch zu pragmatisch, weil die heutigen PCs doch recht schnell sind und die Millisekunden die ich einspare vom Betriebssystem wieder aufgefressen werden.

Bis bald Chemiker

Hansa 21. Mär 2009 18:24

Re: for-Schleife gegen über while-Schleife
 
@Luckie : höre besser auf deinen "Lehrer". Hier wird mehr auf break und sogar auf Exit gesetzt und das ist IMHO kein sauberer Stil. Man sehe sich mal diesen Source an :

Zitat:

Zitat von sx2008
Delphi-Quellcode:
function IsPLZInArray(SonnenStundenListe: TSonnenStunden; PLZ: Integer): Boolean;
var
  i: Integer;
  CurrentPLZ: Integer;
begin
  for i := 0 to length(SonnenStundenListe) - 1 do
  begin
    CurrentPLZ := SonnenStundenListe[i, 0];
    if CurrentPLZ = PLZ then
    begin
      Result := True;
      Exit;
    end;
  end;
  Result := False; // nichts gefunden
end;

Beim ersten gucken hat der mich schon 5 Sek. aufs Glatteis geführt. Zuerst habe ich das kleine "Exit" nicht gesehen (auch nicht erwartet) und dachte, was soll denn das, result wird ja so oder so auf false gesetzt. :shock: Nun ja, das sorgt ja lediglich dafür, dass alles danach kommende einfach ignoriert wird. Genau wie auch Break ist so was für mich quasi ein GOTO ohne Zeilennummern. Warum ist das nun meiner Meinung nach schlechter Stil ?

Erstens aus eigener Erfahrung. Bei meinem ersten größeren Programm habe ich auch überall Exit benutzt. Ist ja schön einfach und "lesbarer". Irgendwann hagelte es aber Quereffekte, die äußerst schwer nachzuvollziehbar waren. Habe solcherlei Konstrukte dann konsequent eliminiert. Dann kam auch noch ein Prof. und hat die Überflüssigkeit solcher Dinge demonstriert. Prinzipiell braucht man die wirklich nicht.

Das ist aber kein Dogma. Es gibt wohl sinnvolle Ausnahmen, aber die Regel sind die nie und nimmer. Register hin oder her. :mrgreen:

Ich bevorzuge jedenfalls Häuser mit einem Ein/Ausgang und nicht welche mit 10 versteckten Ausgängen. :gruebel:

jaenicke 21. Mär 2009 18:35

Re: for-Schleife gegen über while-Schleife
 
Zitat:

Zitat von omata
Das ist wirklich unwichtig, weil man niemals selber optimieren soll. Das ist das oberste Gebot im Compilerbau, optimiere niemals selbst.

Beispiel:
Delphi-Quellcode:
  while (i < length(SonnenStundenListe) - 1) and (not Result) do
  begin
Delphi-Quellcode:
  for I := 0 to length(SonnenStundenListe) - 1 do
  begin
Hier ist while deutlich langsamer, weil bei for Length nur einmal aufgerufen wird, bei while jedoch mehrfach. Obwohl es fast gleich aussieht.
Will man hier also while sinnvoll benutzen, dann muss man das Ergebnis von Length zwischenspeichern und damit selbst optimieren, was der Compiler bei for bereits automatisch tut.

Zitat:

Zitat von Hansa
Ich bevorzuge jedenfalls Häuser mit einem Ein/Ausgang und nicht welche mit 10 versteckten Ausgängen. :gruebel:

Ich bevorzuge Häuser mit Notausgängen und Autobahnen mit Abzweigungen.

Nur weil die Autobahn von Berlin nach Hamburg geht, heißt das ja nicht, dass ich nicht zwischendurch abfahren darf. Trotzdem ist sie schneller als wenn ich solange (while ;-)) über Bundesstraßen in die Richtung fahre bis ich da bin.

Zitat:

Zitat von quendolineDD
In Zeiten der Mehrfachkernprozessoren macht es doch kaum noch Sinn, ob es nun 1 oder 8 Ticks sind, die solch eine banale Abfrage benötigt.

Sagten die Microsoft- und Firefox-Programmierer bei jedem "kleineren" Problem und wunderten sich, warum Chrome und Opera insbesondere beim Programmstart derart viel schneller sind. :roll:

Kleinvieh macht auch Mist. Wenn ich eine Abfrage habe, die 1 ms langsamer ist, weil man es nicht optimal geschrieben hat, dann ist das wenig. Habe ich dann davon 1000, dann ist das schon eine Sekunde...

Satty67 21. Mär 2009 18:44

Re: for-Schleife gegen über while-Schleife
 
Zitat:

Zitat von Hansa
Beim ersten gucken hat der mich schon 5 Sek. aufs Glatteis geführt.

fand das auch unübersichtlich geschrieben:
Delphi-Quellcode:
function IsPLZInArray(SonnenStundenListe: TSonnenStunden; PLZ: Integer): Boolean;
var
  i: Integer;
begin
  Result := False;

  for i := 0 to length(SonnenStundenListe) - 1 do
  begin
    if SonnenStundenListe[i, 0] = PLZ then
    begin
      Result := True;
      Exit;
    end;
  end;

end;
Zitat:

Zitat von Hansa
Ich bevorzuge jedenfalls Häuser mit einem Ein/Ausgang und nicht welche mit 10 versteckten Ausgängen. :gruebel:

Denke eine Funktion sollte sowieso nicht 10 Schleifen enthalten...

Hansa 21. Mär 2009 18:49

Re: for-Schleife gegen über while-Schleife
 
Zitat:

Zitat von jaenicke
Ich bevorzuge Häuser mit Notausgängen und Autobahnen mit Abzweigungen....

Nene, das gilt nicht ! Abzweigungen = Sphagetticode. :mrgreen: Du fährst ja wohl kaum in Hamburg los und sagst einem, den du in Berlin treffen willst "wenn ich nicht da ankomme, dann hole mich bei irgendeiner Behelfsausfahrt ab, welche weiß ich aber noch nicht." :lol:

jaenicke 21. Mär 2009 18:55

Re: for-Schleife gegen über while-Schleife
 
Ein Beispiel ist dieser Code nach dem Prinzip eines endlichen Automaten:
http://www.delphipraxis.net/internal....php?p=1011376
Da würde mir zumindest auf Anhieb keine besonders übersichtliche Variante einfallen, die komplett auf das Herausspringen verzichtet. Das hätte da zu deutlich mehr Abfragen geführt.

Satty67 21. Mär 2009 19:04

Re: for-Schleife gegen über while-Schleife
 
Bei dem Aufbau der Funktionen innerhalb der Funktion und innerhalb der Funktion unterschiedlichen VAR Positionen hab' ich hier vor kurzem erst mit dem Rohrstock eines auf die Finger bekommen. :wink:

Hansa 21. Mär 2009 19:09

Re: for-Schleife gegen über while-Schleife
 
Knackpunkt ist allerdings tatsächlich die Ende-Bedingung :

Zitat:

Zitat von Luckie
Delphi-Quellcode:
while (i < length(SonnenStundenListe) - 1) and (not Result) do
  begin
    CurrentPLZ := SonnenStundenListe[i, 0];
    Result := CurrentPLZ = PLZ;
    Inc(i);
  end;
end;

Ist zwar hier ziemlich einfach, aber ich entflechte das lieber trotzdem so ungefähr :

Delphi-Quellcode:
ende := result;
if not ende then
  ende := not (i < length(SonnenStundenListe) - 1);
while not ende do begin
  CurrentPLZ := SonnenStundenListe[i, 0];
  Result := CurrentPLZ = PLZ;
  Inc(i);
...
end;
Wem 20 Nanosek. wichtiger sind, als seine eigene Programmlogik, der soll meinetwegen sogar auf die eine Variable verzichten. :zwinker:

oki 21. Mär 2009 20:32

Re: for-Schleife gegen über while-Schleife
 
Hi Leute,

auch wenn die Frage jetzt blöd klingt, aber kann mir mal einer sagen warum Break oder Exit jetzt so schlimm in Schleifen sind? Ich geb ehrlich zu, dass ich Break recht häufig verwende. Ich mag while nicht so richtig. Bis jetzt wurde nur von gutem Stil und lesbarkeit gesprochen. Eine fachliche Begründung hab ich noch nicht gesehen (oder überlesen). Ich geb auch ehrlich zu, dass ich vorrangig aus alter Gewohnheit For-Schleifen mit Break anstatt while-Schleifen verwende. Die while-Schleifen fallen eigentlich auch nicht viel schwerer. Hab mir bis jetzt mit Break und Exit nichts gedacht.

Also, was passiert denn nun so schlimmes bei Break und Exit in Schleifen?

Gruß oki


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:47 Uhr.
Seite 4 von 9   « Erste     234 56     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz