Seite 5 von 7
Verfasst: 19.11.2006 23:39
von AND51
Hallo jear.
danke für deinen beitrag. Ich habe deine Prozedur noch nicht getestet, aber sie ist auf jeden Fall optimierbar.
Warum prüfst du nicht ob die Zahl zwischen -999 und 999 liegt? Deine Methode, Abs() zu verwenden dauert doch viel länger, da eine Quad-Zahl erst in eine Float zahl umgewndelt wird und dann nimmst du auch noch StrQ(9, um kleine zahlen zu konvertieren. Wie schon gesagt wurde, nimm Str() um kleine zahlen zu konvertieren!
Und wer sagt, dass sehr große Quadzahlen sich mit Abs konvertieren lassen, so wie du es machst: StrQ(Abs(wert))
Abs gibt eine Float-Zahl zurück, die konvertierst du dann mit StrQ(9 da stimmt was nicht...
Im übrigen ist die While-Schleife die langsamste aller Schleifen; die FOR-Schleife ist die schnellste!!!
Verfasst: 19.11.2006 23:50
von ts-soft
>> Im übrigen ist die While-Schleife die langsamste aller Schleifen; die FOR-Schleife ist die schnellste!!!
So ein Blödsinn. Willste es nicht einsehen. Wichtig ist der Inhalt der Schleife.
Die Geschwindigkeit der Schleifenfunktion ist vollkommen unwichtig. In einer
While Wend Schleife hat man viel mehr Möglichkeiten mit weniger
Durchläufen fertig zu sein und ist somit schneller.
Die Zeit der leeren Schleife spielt im Endeffekt keine Rolle.
Die meisten Optimierungen sind in einer While Wend Schleife möglich!
Verfasst: 20.11.2006 00:05
von jear
@AND51
Du hast recht, da war etwas zu optimieren. Wie so oft, denkt man zu wenig über eine Sache nach, die stets gut funktioniert hat.
Code: Alles auswählen
;/ Lange Zahlen mit Tausendertrenner
Procedure.s StrLong(wert.q, tt.s = ".")
If wert > -1000 And wert < 1000 : ProcedureReturn Str(wert) : EndIf
Protected werts.s = StrQ(wert)
Protected ix.l = Len(werts)
Protected start.l
Protected ix3.l = 3
Protected rets.s
Protected sign.s
If wert < 0 : sign = "-" : start = 1 : EndIf
While ix > start
If ix3 = 0 : rets = tt + rets : ix3 = 3: EndIf
rets = Mid(werts, ix, 1) + rets
ix - 1 : ix3 - 1
Wend
ProcedureReturn sign + rets
EndProcedure
Debug StrLong(-1)
Debug StrLong(-12)
Debug StrLong(-123)
Debug StrLong(-999)
Debug StrLong(-1000)
Debug StrLong(-1234)
Debug StrLong(-12345)
Debug StrLong(-123456)
Debug StrLong(-1234567)
Debug StrLong(-12345678)
Debug StrLong(-123456789)
Debug StrLong(1)
Debug StrLong(12)
Debug StrLong(123)
Debug StrLong(999)
Debug StrLong(1000)
Debug StrLong(1234)
Debug StrLong(12345)
Debug StrLong(123456)
Debug StrLong(1234567)
Debug StrLong(12345678)
Debug StrLong(123456789)
Verfasst: 20.11.2006 00:06
von AND51
Ich würde auf die Schnelle mal behaupten, dass man mit allen drei Arten von Schleifen dasselbe anstellen kann. Direkt hat man bei FOR allerdings nur eine Konstante bei FOR; jedoch kann man indirekt die Zählvariable auch in Unterschiedlichen Schritten erhöhen. Break und Continue funktionieren bei allen Schleifen...
Allerdings habe ich es halt mal probiert, welche Schleife am schnellsten ist, naheliegend ist, alle Schleifen eine gleiche Anzahl Durchgänge durchführen zu lassen. Dabei war die FOR-Schleife halt die schnellste, gefolgt von REPEAT-, zum Schluss (nur ein ganz klein wenig langsamer) die WHILE-Schleife.
@ jear: Kein Problem

Verfasst: 20.11.2006 00:16
von ts-soft
>> Ich würde auf die Schnelle mal behaupten, dass man mit allen drei Arten von Schleifen dasselbe anstellen kann
Nein, es ist wichtig, ob Kopf oder Fußschleife. For Next bietet nur Vorteile
wenn die Anzahl Durchläufe fest steht, bzw. die Laufvariable auch genutzt
wird. For Next mit Break zu beenden gehört zum unschönen Programmierstil.
Im Endeffekt wird die Zeit der Schleife durch Ihren Inhalt bestimmt, also
nimmt man die passenste Schleife für sein Vorhaben.
Sicherlich gibts auch Sachen, die mein Gleichwertig in allen Schleifentypen
umsetzen kann, da hätteste Recht, aber die ersparte Zeit würde aber auch
nach Jahren nicht zum Trinken einer Tasse Kaffee reichen

Verfasst: 20.11.2006 00:32
von AND51
> Im Endeffekt wird die Zeit der Schleife durch Ihren Inhalt bestimmt, also nimmt man die passenste Schleife für sein Vorhaben.
Das ist schön gesagt!
Du hast Recht. Aber das es "unschön" ist, eine Schleife vorzeitig mit Break zu beenden, finde ich nicht (hauptsache, man übertreibt es nicht). Es ist besser und sehr viel schneller, als die Abbruchbedingung der Schleife vorzeitig herzustellen, vor allem, wenn man schon am Anfang der Schleife z. B. durch IF feststellt, dass die Schleife abgebrochen werden muss.
CONTINUE benutze ich auch regelmäßig.
Verfasst: 20.11.2006 00:48
von ts-soft
>> CONTINUE benutze ich auch regelmäßig.
Ist ja auch nicht dasselbe wie Break
Break ist auch nicht böse

. nur in einer For Next Schleife absolut
unpassend. Weil dies eine Schleife sein sollte, wo die Durchläufe fest stehen.
Bloß um 2 tausendsel einer Sekunde zu sparen nimmt man kein For Next.
PS: In ForEach verwende ich auch regelmässig Break

Verfasst: 20.11.2006 01:17
von al90
ts-soft hat geschrieben:PS: In ForEach verwende ich auch regelmässig Break

Thomas,
Break ist bei grossen Projekten leider unvermeidlich.
Jüngstes beispiel ist z.b. bei meiner CopyFunktion in FileMaster.
Ein [Abbrechen] - Button Breakt die For/Next Schleife. Sicherlich
keine schöne methode, aber bei Reapeat und While würden wir es
als genauso unschön ansehen. Anderseits glaube ich eher wir sind mit
dieser Regel zu sehr aufgewachsen, da wir es als "Unsauber" bezeichnen.

Verfasst: 20.11.2006 08:15
von #NULL
für matrizen und der gleichen finde ich For/Next einfach passender, auch
wenn ich vielleicht einen wert in einer tabelle suche, und dann mit suchen
aufhören möchte (Break). ist zwar nicht das schönste, aber ich finde es
immernoch übersichtlicher, als mich mit While/Wend-konstrukten durch ein
2-dim array durchzubasteln.
@and110011
deine proc vermisst unicode.

Verfasst: 20.11.2006 12:33
von Hellhound66
Ich benutz so gut wie nie For-Schleifen (oben hab ich fremden Code optimiert, deshalb hab ich sie drinne gelassen) und baue mein While Schleifen (Repeat nutze ich auch ungern) immer so, dass es passt. So kann ich sie auch jederzeit ohne Break verlassen.
Allgemein:
Irgendwas als unsauber zu benennen ist immer gefährlich. Ich nutze nie Breaks (außer oben im Besipel, aber das liegt daran dass es eine For-Schleife enthielt, die ich auch fast nie nutze ^^), aber ich würde nie sagen, Break zu nutzen wäre unsauber.