Seite 1 von 1

Problem mit String vergleichen

Verfasst: 21.02.2008 22:24
von obar
Habe ein Problem mit folgendem Code.


Ist nur ein Dummy-Code(Sinnlos-Code) wo 2 Strings verglichen werden.

Sind meine ersten Gehversuche mit Pointer.

Code: Alles auswählen

DisableDebugger

Dim wort.s(0)
Dim ZufallsWort.s(1)

AnzWorte.l   = 0
WortFinden.l = 1

Wort(0)        = "Oli"
ZufallsWort(0) = "Oli"

Z1.f = ElapsedMilliseconds()

For Schleife = 0 To 10000000
    
    SuchWort.s = Wort(Random(AnzWorte))
      
    For i = 0 To WortFinden
        If ZufallsWort(i) = SuchWort
            ; Code  
        EndIf
    Next
  
Next

Z2.f = ElapsedMilliseconds()
MessageRequester("Zeit: ",  Str(Z2-Z1)+" ms")
End
Nun hab ich versucht dies schneller zu machen.

Code: Alles auswählen

DisableDebugger

Dim wort.s(0)
Dim ZufallsWort.s(1)

AnzWorte.l   = 0
WortFinden.l = 1

Wort(0)        = "Oli"
ZufallsWort(0) = "Oli"

Z1.f = ElapsedMilliseconds()

For Schleife = 0 To 10000000
        
    *SuchWort = @Wort(Random(AnzWorte))
        
    For i = 0 To WortFinden
        If ZufallsWort(i) = PeekS(*SuchWort)
            ; Code    
        EndIf
    Next
  
Next

Z2.f = ElapsedMilliseconds()
MessageRequester("Zeit: ",  Str(Z2-Z1)+" ms")
End
oder

Code: Alles auswählen

DisableDebugger

Dim wort.s(0)
Dim ZufallsWort.s(1)

AnzWorte.l   = 0
WortFinden.l = 1

Wort(0)        = "Oli"
ZufallsWort(0) = "Oli"

Z1.f = ElapsedMilliseconds()

For Schleife = 0 To 10000000
        
    SuchWort.s = Wort(Random(AnzWorte))
        
    For i = 0 To WortFinden
        If ZufallsWort(i) = PeekS(@SuchWort)
            ; Code    
        EndIf
    Next
  
Next

Z2.f = ElapsedMilliseconds()
MessageRequester("Zeit: ",  Str(Z2-Z1)+" ms")
End
Code 2 + 3 sind viel langsamer als der erste. Kann mir dies einer erklären. Wieso das so ist.

Wie könnte man den Code via Pointer beschleunigen?

Ist das überhaupt richtig wie ich den Pointer einsetze?

Verfasst: 21.02.2008 23:01
von HeX0R

Code: Alles auswählen

DisableDebugger

Dim wort.s(0)
Dim ZufallsWort.s(1)

AnzWorte.l   = 0
WortFinden.l = 1

Wort(0)        = "Oli"
ZufallsWort(0) = "Oli"

Z1.l = ElapsedMilliseconds()

For Schleife = 0 To 10000000
       
    *SuchWort = @Wort(Random(AnzWorte))
       
    For i = 0 To WortFinden
        If CompareMemoryString(@ZufallsWort(i), *SuchWort) = 0
            ; Code   
        EndIf
    Next
 
Next

Z2.l = ElapsedMilliseconds()
MessageRequester("Zeit: ",  Str(Z2-Z1)+" ms")
End
Das wundert mich jetzt aber selbst, dass das so viel schneller ist, als das simple Vergleichen der Strings selbst. Sollte doch eigentlich intern kein Unterschied sein, oder ?

Verfasst: 22.02.2008 01:10
von Xaby
Ich denke, um den Grund zu finden, und richtig zu beurteilen sollte der String nicht immer gleich sein. Da es hier auch sein kann, dass das Betriebssystem bzw. der Prozessor einen starken Einfluss auf die Optimierung haben kann.
Wenn zum Beispiel ein Cache nicht geleert wird, oder nach der dritten Schleife dieser gesondert im Speicher abgelegt wird. .... etc.
Bei einigen Programmen, die von der Diskette/Stick gestartet werden macht das Windows XP zum Beispiel.


>>>> code 1 Modifikation a

Code: Alles auswählen

DisableDebugger

Dim wort.s(0)
Dim ZufallsWort.s(1)

AnzWorte.l   = 0
WortFinden.l = 1


Z1.f = ElapsedMilliseconds()

For Schleife = 0 To 10000000
   
   
   
  Wort(0)        = Str(Random(100))
  ZufallsWort(0) = Str(Random(100))
  ZufallsWort(1) = Str(Random(100))   
   
   SuchWort.s = Wort(Random(AnzWorte)) 

     
    For i = 0 To WortFinden
        If ZufallsWort(i) = SuchWort
            ; Code 
        EndIf
    Next
 
Next

Z2.f = ElapsedMilliseconds()
MessageRequester("Zeit: ",  Str(Z2-Z1)+" ms")
End
>>>> code 1 Modifikation b

Code: Alles auswählen

DisableDebugger

Dim wort.s(0)
Dim ZufallsWort.s(1)

AnzWorte.l   = 0
WortFinden.l = 1


Z1.f = ElapsedMilliseconds()

For Schleife = 0 To 10000000   
   
   SuchWort.s = Wort(Random(AnzWorte)) 

  Wort(0)        = Str(Random(100))
  ZufallsWort(0) = Str(Random(100))
  ZufallsWort(1) = Str(Random(100))   

     
    For i = 0 To WortFinden
        If ZufallsWort(i) = SuchWort
            ; Code 
        EndIf
    Next
 
Next

Z2.f = ElapsedMilliseconds()
MessageRequester("Zeit: ",  Str(Z2-Z1)+" ms")
End
Bei mir ist
>>>> code 1 Modifikation b
schneller als a :shock:

Obwohl sie doch eigentlich exakt gleich sein müssten?
Was passiert also? Wird das Programm anders compiliert?
Der Speicher anders benutzt?

:shock:

>> Das wird mit Lese und Schreibzugriffen im Speicher zusammenhängen.
Vielleicht sollten wir da Regeln aufstellen, damit wir immer schnellen Code haben :roll:

Verfasst: 22.02.2008 17:28
von obar
Kann mir hier keiner Helfen?? :cry:

Verfasst: 22.02.2008 20:02
von Kaeru Gaman
da stehen doch beispiele, wie man das mit pointern macht...

Verfasst: 22.02.2008 22:21
von obar
@Kaeru Gaman

Ja, das hab ich schon gesehen. Aber ich ging davon aus, dass es mit Pointer schneller gehen muss, dies ist aber bei meinen Beispielen,
sowie die von HeX0R nicht der Fall. Ich dachte mir, vielleicht setze ich die Pointer falsch ein. Ich hoffte auf eine Erklärung, wieso
die Pointervarianten langsamer sind und vielleicht noch Beispiel-Codes die schneller sind als die von mir geschriebenen.

@HeX0R

Danke für dein Beispiel.

Verfasst: 22.02.2008 22:27
von HeX0R
Also bei mir ist mein Beispiel etwa 5 mal so schnell, wie das direkte Vergleichen der Strings.
Ich benutze PB4.2Beta, keine Ahnung welche Version du hast.

Verfasst: 22.02.2008 22:32
von obar
Ich hab PB4.1

Also, nur das wir nicht aneinander vorbeireden. Bei dir ist dein Beispiel 5 mal schneller als dieses hier.

Code: Alles auswählen

DisableDebugger 

Dim wort.s(0) 
Dim ZufallsWort.s(1) 

AnzWorte.l   = 0 
WortFinden.l = 1 

Wort(0)        = "Oli" 
ZufallsWort(0) = "Oli" 

Z1.f = ElapsedMilliseconds() 

For Schleife = 0 To 10000000 
    
    SuchWort.s = Wort(Random(AnzWorte)) 
      
    For i = 0 To WortFinden 
        If ZufallsWort(i) = SuchWort 
            ; Code  
        EndIf 
    Next 
  
Next 

Z2.f = ElapsedMilliseconds() 
MessageRequester("Zeit: ",  Str(Z2-Z1)+" ms") 
End