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 :wink:

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. :mrgreen:
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. :wink:

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]

Bild 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 :mrgreen:

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)