Seite 3 von 4

Verfasst: 05.02.2008 17:37
von AND51
Andreas_S hat geschrieben:
AND51 hat geschrieben:> Mir ist geschwindigkeit auch wichtig
Ich seh schon, wir verstehen uns^^ Gefällt mir, deine Einstellung :allright:
Genau :allright:
Also als erstes achte ich immer auf Sicherheit, also dass mein Code mit EnableExplicit und Unicode zurechtkommt, Protected benutzt, und so weiter.
Das ist ja relativ einfach zu bewerkstelligen, dann kann der Speed kommen.

Achtung, Andreas_S, dein Code ist etwas buggy:
Probier mal

Code: Alles auswählen

Debug irgendeinBefehl("abc")
Daraus wird
ABc
Das hast du bei deinem Code nicht gesehen, weil dem Text ein '<' voransteht.

Verfasst: 05.02.2008 20:33
von Andreas_S

Code: Alles auswählen

Procedure.s irgendeinBefehl( str.s )
   Protected *ptr.CHARACTER = @str, space = 1
   
   While *ptr\c
      If *ptr\c = 32
         space = 1
      Else
         If space = 1
            If (*ptr\c >= 97) And (*ptr\c <= 122)
               *ptr\c - 32
               space = 0
            EndIf
         EndIf
      EndIf
      *ptr + SizeOf(CHARACTER)
   Wend
   
   ProcedureReturn str
EndProcedure 


Debug irgendeinBefehl("abc")

:? Bei mir kommt da "Abc" raus...

Ja Protected ist bei mir auch pflicht...
EnableExplicit ist bei mir nicht so wichtig (Basic aufjedenfall, bei Java und C++ ist das so oder so standart. Vil. verwend ichs jetzt...).

Verfasst: 05.02.2008 20:41
von AND51
Komisch... Ich hatte es zugegeben nur mit deinem Beispiel getestet und darauf spekuliert, dass es mit "abc" genauso sein muss.

Probier selbst und du siehst, aus "dies" wird "DIes"

Code: Alles auswählen

Procedure.s irgendeinBefehl( str.s ) 
   Protected *ptr.CHARACTER = @str, space = 1 
    
   While *ptr\c 
      If *ptr\c = 32 
         space = 1 
      Else 
         If space = 1 
            If (*ptr\c >= 97) And (*ptr\c <= 122) 
               *ptr\c - 32 
               space = 0 
            EndIf 
         EndIf 
      EndIf 
      *ptr + SizeOf(CHARACTER) 
   Wend 
    
   ProcedureReturn str 
EndProcedure 


Debug irgendeinBefehl("<Dies 'ist #ein +testtext, ~um 3zu 4zeigen &was (passierte") 
PB 4.20 BETA 2

Verfasst: 05.02.2008 20:52
von Andreas_S
Da hast du recht...
Ich mach was dagegen^^

Andreas

Verfasst: 05.02.2008 20:58
von HeX0R
AND51 hat geschrieben: Probier selbst und du siehst, aus "dies" wird "DIes"
Soso und bei dir sieht es besser aus ?

Code: Alles auswählen

Procedure.s Capitalize(text.s)
   Protected *pos.Character=@text
   While *pos\c
      While *pos\c < 'a' Or *pos\c > 'z'
         *pos+SizeOf(Character)
      Wend
      *pos\c-32
      While (*pos\c >= 'a' And *pos\c <= 'z') Or (*pos\c >= 'A' And *pos\c <= 'Z')
         *pos+SizeOf(Character)
      Wend
   Wend
   ProcedureReturn text
EndProcedure

Debug Capitalize("<Dies 'ist #ein +testtext, ~um 3zu 4zeigen &was (passierte")

Verfasst: 05.02.2008 21:18
von AND51
Tatsache, ist mir nicht aufgefallen!
Komisch! :o
Werds mal irgendwie korrigieren!

Verfasst: 05.02.2008 22:42
von Andreas_S
Das was Kiffi meinte:

Code: Alles auswählen

Procedure.s irgendeinBefehl( str.s )
	Protected *ptr.CHARACTER = @str, isSeperator.b = 1, if1.b, if2.b
	
	While *ptr\c
		if1 = *ptr\c > 96 And *ptr\c < 123
		if2 = *ptr\c > 64 And *ptr\c < 91
		
		If if1 Or if2
			If if1 And isSeperator
				*ptr\c - 32
			ElseIf if2 And Not isSeperator
				*ptr\c + 32
			EndIf
			isSeperator = 0
		EndIf
		If *ptr\c = 32
			isSeperator = 1
		EndIf
		*ptr + SizeOf(CHARACTER)
	Wend
	
	ProcedureReturn str
EndProcedure


Debug irgendeinBefehl("<DiES 'isT #eIn +testText, ~um 3zu 4zEigen &wAs (paSsierte")
Ist leider noch eine Spur langsamer...
Glaub aber das man das nicht mehr schneller machen kann, es seidenn es kann mir jemand das gegenteil beweisen^^

Andreas

Verfasst: 05.02.2008 22:51
von Kiffi
Andreas_S hat geschrieben:Das was Kiffi meinte:
wahrscheinlich zu kompliziert gedacht. ;-)

Code: Alles auswählen

Procedure.s irgendeinBefehl( str.s )
  str = LCase(str)
  ; Hier geht Andreas' Kram los
  ; [...]
  ProcedureReturn str
EndProcedure
(ob's schneller ist, weiß ich nicht...)

Grüße ... Kiffi

Verfasst: 05.02.2008 22:59
von Andreas_S
Denk nicht das das schneller ist, weil LCase(str) so oder so eine schleife durch den ganzen string läuft.
Dann hab ich genauso eine schleife. Wenn ich dann noch meine voherige Prozedure drüber laufen lasse dann dauert das schätzungsweise 2x so lang...

Aber gute Idee, wäre selbst nicht draufgekommen das das auch so gehn könnte... :allright:

Andreas

Verfasst: 05.02.2008 23:08
von HeX0R
Meins is schneller ;)

Code: Alles auswählen

Procedure.s irgendeinBefehl( str.s )
   Protected *ptr.CHARACTER = @str, isSeperator.b = 1, if1.b, if2.b
   
   While *ptr\c
      if1 = *ptr\c > 96 And *ptr\c < 123
      if2 = *ptr\c > 64 And *ptr\c < 91
      
      If if1 Or if2
         If if1 And isSeperator
            *ptr\c - 32
         ElseIf if2 And Not isSeperator
            *ptr\c + 32
         EndIf
         isSeperator = 0
      EndIf
      If *ptr\c = 32
         isSeperator = 1
      EndIf
      *ptr + SizeOf(CHARACTER)
   Wend
   
   ProcedureReturn str
EndProcedure 

Procedure.s wasnlos(str.s)
	Protected *ptr.CHARACTER = @str - SizeOf(CHARACTER), space.l

	Repeat
		*ptr + SizeOf(CHARACTER)
		If *ptr\c = 0
			Break
		ElseIf *ptr\c = 32
			space = 0
			Continue
		ElseIf space = 0
			If *ptr\c > 64 And *ptr\c < 91
				space = 1
				Continue
			ElseIf *ptr\c < 97 Or *ptr\c > 122
				Continue
			EndIf
			*ptr\c ! $20
			space = 1
		ElseIf *ptr\c > 64 And *ptr\c < 91
			*ptr\c | $20
		EndIf
	ForEver

	ProcedureReturn str
EndProcedure


#CheckIT = "<DiES 'isT #eIn +testText, ~um 3zu 4zEigen &wAs (paSsierte"
CompilerIf #PB_Compiler_Debugger
Debug irgendeinBefehl(#CheckIT)
Debug wasnlos(#CheckIT)
End
CompilerEndIf

startTime = ElapsedMilliseconds()
For i = 0 To 10000000
	irgendeinBefehl(#CheckIT)
Next
time1 = ElapsedMilliseconds() - startTime

startTime = ElapsedMilliseconds()
For i = 0 To 10000000
	wasnlos(#CheckIT)
Next
time2 = ElapsedMilliseconds() - startTime



MessageRequester("Andreas_S vs. HeX0R","Andreas_S: " + Str(time1) + #LF$ + "HeX0R: " + Str(time2))