Code Optimierung???

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

AL90

Betreff: Code Optimierung???

BeitragMo, Okt 03, 2005 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

Hat jemand ne idee wie man folgenden Code noch optimieren könnte?
Bin für jeden Tipp dankbar. Wink

Code: [AUSKLAPPEN]

Function CompareMemory(bank1,offset1,bank2,offset2,length)
result=1
If length=2
  If PeekShort(bank1,offset1)=PeekShort(bank2,offset2) Then Return result
Else
  For i=0 To length-1 Step 4
    a=PeekInt(bank1,offset1+i)
    b=PeekInt(bank2,offset2+i)
    If a<>b Then result=0:Exit
  Next
EndIf
Return result
End Function
Ciao
AL90

www.blitztools.de.vu

Artemis

BeitragDi, Okt 04, 2005 7:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht so:
Code: [AUSKLAPPEN]
Function CompareMemory(bank1,offset1,bank2,offset2,length)
  If length=2
    If PeekShort(bank1,offset1)=PeekShort(bank2,offset2) Then Return 1
   Else
    For i=0 To length-1 Step 4
      a=PeekInt(bank1,offset1+i)
      b=PeekInt(bank2,offset2+i)
      If a<>b Then Return 0
    Next
  EndIf
  Return 1
End Function


Du hast dann keine zusätzliche variable mehr. und das exit aus der schleife entfällft.

Jan_

Ehemaliger Admin

BeitragDi, Okt 04, 2005 8:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich gehe mal von Geschwindigkeits optimierung aus,

BlitzBasic: [AUSKLAPPEN]

Graphics 640,480,32,2
SetBuffer BackBuffer()

a=CreateBank(1000000)
b=CreateBank(1000000)
For i=0 To 1000000-1
m=Rand(0,255)
PokeByte a,i,m
;If m=1 Then m=2
PokeByte b,i,m
Next

Repeat
Cls
t1=MilliSecs()
l=CompareMemory(a,0,b,0,1000000)
t2=MilliSecs()
t3=t3+(t2-t1)
t4=t4+1
Text 0,0, \"Aktuell:\"+(t2-t1)
Text 0,15,\"Durchschnitt:\"+ (Float(t3)/t4)
Text 0,30,\"Ergebniss:\"+l
Flip 0
Until KeyHit(1)
End
Function CompareMemory(bank1,offset1,bank2,offset2,length)
length=length+4
Repeat
If PeekInt(bank1,offset1+i)=PeekInt(bank2,offset2+i) Else Return 0
i=i+4
Until i> length
Return 1
End Function


Also, aufm p3 600 MHZ, 382 mb sdram schafft das ding jetzt 27 mb pro Bank in 1ner Sekunde zu vergleichen.
...

Ich denke doch, das reicht aus.
between angels and insects
  • Zuletzt bearbeitet von Jan_ am Di, Okt 04, 2005 11:33, insgesamt einmal bearbeitet
 

Klaas

BeitragDi, Okt 04, 2005 10:30
Antworten mit Zitat
Benutzer-Profile anzeigen
aber müßte nicht i hinter dem Vergleich inkrementiert werden

Code: [AUSKLAPPEN]

Function CompareMemory(bank1,offset1,bank2,offset2,length)
  Repeat
    If PeekInt(bank1,offset1+i)=PeekInt(bank2,offset2+i) Else Return 0
  i=i+4 ; <-- besser hier
  Until i> length
 Return 1
End Function

Jan_

Ehemaliger Admin

BeitragDi, Okt 04, 2005 11:32
Antworten mit Zitat
Benutzer-Profile anzeigen
ja, sorry für den kleinen Logic fehler, Quelltext oben berichtigt.
between angels and insects

AL90

BeitragDi, Okt 04, 2005 22:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute,

Erstmal Danke für die zahlreichen tips. Wink
Ich werde sie mal für mein vorhaben ausprobieren und dann melde
ich mich wieder und gebe mal bescheid um wieviel die codes schneller sind.
Ciao
AL90

www.blitztools.de.vu

AL90

BeitragMi, Okt 05, 2005 22:07
Antworten mit Zitat
Benutzer-Profile anzeigen
So hab jetzt mal den test gemacht. Ergebnis: Leider waren sie
nur geringfügig schneller, weshalb ich also erstmal bei meiner
alten routine bleibe.

Nochmals Danke für Eure versuche. Wink
Ciao
AL90

www.blitztools.de.vu

Jan_

Ehemaliger Admin

BeitragDo, Okt 06, 2005 11:10
Antworten mit Zitat
Benutzer-Profile anzeigen
ja, viel zu optimieren geht da nciht.
between angels and insects
 

Klaas

BeitragDo, Okt 06, 2005 11:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab jetzt eine schnellere Varianten gefunden über die zlib.dll

Die schafft auf meinem Rechner 3.2 zu 5.2 mit der alten Funktion

Vorteil der alten Funktion das wenn sehr früh eine Ungleicheit auftritt wird diese sehr viel schneller.

Muß man sich fragen wie häufig das auftritt!
Zudem muß man sagen das die wahrscheinlichkeit 2 gleiche Checksummen bei unterschiedlichen Banks zu bekommen sehr niedrig ist aber doch vorhanden.

da findest du die userlib und die Funktionen:
http://www.blitzbasic.com/code...p?code=962

hier findest du die dll:
http://www.winimage.com/zLibDll/

Code: [AUSKLAPPEN]

Function CompareMemory(bank1,offset1,bank2,offset2,length)
   adler1 = gzip_adler32bank(bank1)
   adler2 = gzip_adler32bank(bank2)
   
   If adler1 = adler2 Then Return True
   Return False


einziges Problem:
man kann nicht nur Teile der Banks vergleichen und ein zerschneiden der Bank währe wohl sehr viel langsamer!

AL90

BeitragDo, Okt 06, 2005 22:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Speedmäßig sieht das sehr interessannt aus. Nur leider kann ich das
nicht einsetzen da meine CrunchEngine sonst von externen Dateien
abhängig wäre. Und genau das ist es was ich eigentlich vermeiden wollte.
Auch das "Fehl-auffinden" von gleichheiten könnte zum
problem werden. (Grössere Packergebnisse) Hashtables sind
für mein vorhaben unumgänglich, aber es müsste schon was sein
das wirklich korrekte werte liefert. Ich dachte der eine oder andere
hätte vielleicht doch 'nen "blitzgedanken" was ich evtl. übersehen
haben könnte. Aber ich glaube ich muss einsehen das es mit reinen
BB-Befehlen wohl oder übel doch nicht geht. Nochmals Danke an alle
beteiligten für die Optimierungs-versuche und Tipps. Wink
Ciao
AL90

www.blitztools.de.vu

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group