Problem mit String vergleichen

Anfängerfragen zum Programmieren mit PureBasic.
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Problem mit String vergleichen

Beitrag 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?
Zuletzt geändert von obar am 22.02.2008 02:12, insgesamt 1-mal geändert.
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag 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 ?
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag 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:
Kinder an die Macht http://scratch.mit.edu/
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Beitrag von obar »

Kann mir hier keiner Helfen?? :cry:
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

da stehen doch beispiele, wie man das mit pointern macht...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Beitrag 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.
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag 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.
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Beitrag 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
Antworten