Seite 4 von 7
Verfasst: 19.11.2006 13:42
von #NULL
hier kann man dem wachsenden speicher zusehen
Code: Alles auswählen
Procedure foo()
d=1000
size=2<<19
Protected Dim a.b(size)
Beep_(1000,100)
Delay(d)
Protected Dim b.b(size)
Beep_(1000,100)
Delay(d)
Protected Dim c.b(size)
Beep_(1000,100)
Delay(d)
Protected Dim d.b(size)
Beep_(1000,100)
Delay(d)
Protected Dim e.b(size)
Beep_(1000,100)
Delay(d)
Protected Dim f.b(size)
Beep_(1000,100)
Delay(d)
Protected Dim g.b(size)
Beep_(1000,100)
Delay(d)
Protected Dim h.b(size)
Beep_(1000,100)
Delay(d)
EndProcedure
foo()
Verfasst: 19.11.2006 13:47
von ts-soft
Sollte sich also lohnen, die Procedure vorzeitig zu verlassen

Verfasst: 19.11.2006 16:09
von Hellhound66
/offtopic:
Dim ist ja wiederum was anderes als ne "normale" Variable, da hierfür Speicher auf dem Heap angefordert wird. Da ich dims nicht von Hand komplett löschen kann, benutz ich sie auch nicht, wenn ich den gleichen Effekt über Allocatememory() erreichen kann..
Verfasst: 19.11.2006 20:35
von al90
AND51 hat geschrieben:Ich habe übrigens meine neue Prozedur mit deiner Verglichen, al90.
Ohne Debugger, 3 Mio. durchläufe, pro Durchlauf die Zahlen 123 und 123456789.
AND51: ~20,6 Sek.
al90: ~28,0 Sek.
Wie gesagt, Speed ist nicht alles. Fehlerfreiheit is the Number One.
und wie ich sehe hast du das problem mit
123124 noch immer nicht gelöst.
ts-soft hat geschrieben:
Beim "Optimieren" übersehen haben anscheinend Alle, das Werte unter 1000
unverändert als Str() zurückgegeben werden können.
Übersehen habe ich das nicht. Habe es für diesen zweck aber weggelassen
da wir hier eh mit For/Next schleifen testen. 0-5000000 oder so.
Da machen die 0-999 auch nicht viel aus. Richtig lohnen würde es sich
erst beim einlesen von langen verzeichnissen mit vielen Klein-Files.

Verfasst: 19.11.2006 20:38
von Proton
Kann auf meinem schnellen Computer keine Unterschiede feststellen.
Verfasst: 19.11.2006 20:41
von al90
#NULL hat geschrieben:[@al90]

jetzt auch mit unicode support

:
Werde ich mir mal genauer ansehen.

Verfasst: 19.11.2006 20:51
von al90
Hellhound66 hat geschrieben:Also wenn es um Speed geht, dann würde ich nicht Poke() nutzen, sondern direkt über Pointer arbeiten oder gleich ASM nutzen.
Nicht übel, sprach der Dübel.

Verfasst: 19.11.2006 22:35
von AND51
Wieso habe ich meine neueste Version noch nicht hier reingestellt? Ich mach es mal.
@ al90: Du wirst sehen, ich schaffe sogar 123124
Code: Alles auswählen
Procedure.s tausendertrennzeichen(zahl.q, separator.s=".")
Protected zahl$=StrQ(zahl), start.l=Len(zahl$)%3, res.s=PeekS(@zahl$, start), n.l
For n=start To Len(zahl$)-start-1 Step 3
res+separator+PeekS(@zahl$+n, 3)
Next
If start
ProcedureReturn res
Else
ProcedureReturn PeekS(@res+Len(separator))
EndIf
EndProcedure
Debug tausendertrennzeichen(123124)
Ich werde versuchen, noch zwei Verbesserungen einzubauen, eine davon ist eine, an die bisher noch keiner außer Rainer dran gedacht hat... Schmunzel...

Verfasst: 19.11.2006 22:41
von AND51
Verbesserungen eingebaut.
Punkt 1: Zahlen von -999 bis 999 werden direkt zurückgegeben.
Punkt 2: da hat (außer mir) keiner dran gedacht: Man kann auch kleine Zahlen gruppieren: Was wäre z. B. mit -54157 ?
Code: Alles auswählen
Procedure.s tausendertrennzeichen(zahl.q, separator.s=".")
If zahl > -1000 And zahl < 1000
ProcedureReturn Str(zahl)
EndIf
Protected zahl$=RemoveString(StrQ(zahl), "-"), start.l=Len(zahl$)%3, res.s=PeekS(@zahl$, start), n.l
For n=start To Len(zahl$)-start-1 Step 3
res+separator+PeekS(@zahl$+n, 3)
Next
If zahl < 0
res="-"+res
EndIf
If start
ProcedureReturn res
Else
ProcedureReturn PeekS(@res+Len(separator))
EndIf
EndProcedure
Debug tausendertrennzeichen(1234567890)
Debug tausendertrennzeichen(123456789)
Debug tausendertrennzeichen(12345678)
Debug tausendertrennzeichen(1234567)
Debug tausendertrennzeichen(123456)
Debug tausendertrennzeichen(12345)
Debug tausendertrennzeichen(1234)
Debug tausendertrennzeichen(123)
Debug tausendertrennzeichen(12)
Debug tausendertrennzeichen(1)
Debug tausendertrennzeichen(0)
Debug tausendertrennzeichen(-1)
Debug tausendertrennzeichen(-12)
Debug tausendertrennzeichen(-123)
Debug tausendertrennzeichen(-1234)
Debug tausendertrennzeichen(-12345)
Debug tausendertrennzeichen(-123456)
Debug tausendertrennzeichen(-1234567)
Debug tausendertrennzeichen(-12345678)
Debug tausendertrennzeichen(-123456789)
Debug tausendertrennzeichen(-1234567890)
Verfasst: 19.11.2006 22:56
von jear
Doch. Schon lange im Einsatz
Code: Alles auswählen
;/ Lange Zahlen mit Tausendertrenner
Procedure.s StrLong(wert.q, tt.s = ".")
If Abs(wert) < 1000 : ProcedureReturn StrQ(wert) : EndIf
Protected rets.s
Protected sign.s = ""
Protected werts.s = StrQ(Abs(wert))
Protected ix.l = Len(werts)
Protected ix3.l
If wert < 0 : sign = "-" : EndIf
While ix > 0
If ix3 = 3 : rets = tt + rets : ix3 = 0: 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(-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(1234)
Debug StrLong(12345)
Debug StrLong(123456)
Debug StrLong(1234567)
Debug StrLong(12345678)
Debug StrLong(123456789)