Tausendertrennzeichen für (große) Zahlen
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!!!
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!!!
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
>> 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!
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!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

@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.
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)
Man ist nie zu alt zum lernen, auch wenn man dabei manchmal alt aussieht!
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
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

PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
>> 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
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

PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

> 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.
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.
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
>> 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
Ist ja auch nicht dasselbe wie Break

Break ist auch nicht böse

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

PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Thomas, Break ist bei grossen Projekten leider unvermeidlich.ts-soft hat geschrieben:PS: In ForEach verwende ich auch regelmässig Break
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.

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.

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.


-
- Beiträge: 476
- Registriert: 23.03.2005 23:19
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.
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.
Optimismus ist ein Mangel an Information.