Seite 1 von 5
Wie Arbeitet CompareMemory() ??
Verfasst: 08.07.2005 21:24
von PAMKKKKK
Hallo !
Da ich mich auch an einem Programm versuche, das doppelte Dateien vergleicht, würde ich gerne wissen wie CompareMemory() eigentlich intern Arbeitet.
Da die Hilfe wie so oft bei PB leider nicht sehr viel hergibt

!
Weiss jemand ob das Teil einen Bytweisen vergleich macht und bei ungleichheit abbricht? Oder ob es mit CRC32 oder MD5 oder anders Arbeitet??
Verfasst: 08.07.2005 21:36
von Deeem2031
Ich schätze die Proc vergleicht jedes Byte und bricht bei Ungleichheit ab, alles andere wäre sinnlos. Warum einen CRC32/MD5 Wert außerdem noch berechen wenn er nicht nötig ist?
Verfasst: 08.07.2005 21:43
von NicTheQuick
Ich würde das ganze noch etwas präzisieren und einfach mal wild behaupten, dass [c]CompareMemory()[/c] Long weise vergleicht, also in 4-Bytes-Schritten, da die Programme ja in den meisten Fällen auf einer 32-Bit CPU laufen und dieser Vergleich dann schneller wäre.
Bei Ungleichheit bricht die Procedure dann einfach ab.
Verfasst: 08.07.2005 21:56
von Deeem2031
Das einzige Problem läge dann nurnoch daran, das Längen die kein Vielfaches von 4 sind nicht so einfach verglichen werden können. Da fallen mir zwar auf Anhieb 2 Möglichkeiten ein das zu umgehen, aber ich würde es erstmal Byte-weise versuchen. Aber wozu rumraten wenn man doch nachgucken kann wie CompareMemory funktioniert...
Verfasst: 08.07.2005 22:03
von Deeem2031
Ähm, ja... interessant... optimierungsbedürftig würde ich dazu erstmal sagen.
Also die Proc liest erst einen long (4 Byte) aus, löscht dann die oberen 3 Bytes (so ähnlich wie ...&$FF) und vergleicht dann die longs. Danach springt der Pointer 1 weiter, natürlich nur wenn die longs gleich sind
Also keines von beidem, es vergleicht nicht 4 Bytes auf einmal, aber jedes Byte einzeln auch nicht wirklich. Naja, wer soll auch darauf kommen das die Proc so scheiße geproggt ist ^^
[EDIT] Oh, nein, hab mich geirrt, die 4 Bytes die zuerst ausgelesen werden sind nicht aus dem Memory sondern sind Pointer auf den Mem. Ändert aber nichts daran das es scheiße und lahm geproggt ist
Verfasst: 09.07.2005 12:32
von Deeem2031
Hab mal bisl an der Library rumgebastelt und das Ergebnis ist mehr oder weniger erstaunend. Meine neue CompareMemory() -Proc braucht gerade einmal ein Zehntel der Alten. (Meine: ca. 500 ms / PB: ca. 5000 ms (10000000*50 Byte) )
Wer also eine bischen schnellere Proc haben will:
www.deeem2031.de/Memory
Ich hab die Library von PB 3.93 geändert, sollte aber auch mit anderen Versionen funktionieren.
Verfasst: 09.07.2005 12:43
von Kiffi
> Meine neue CompareMemory() -Proc braucht gerade einmal ein Zehntel
> der Alten.
da hört sich sehr gut an!
Nun böte sich an, dass Du Deine Änderungen an Fred weiterleitest,
damit er diese in seine Lib mit übernehmen kann.
Grüße ... Kiffi
Verfasst: 09.07.2005 12:54
von MVXA
Kannst du deine Procedure nochmal testen aber in dem du mit PB einmal 2 Strings vergleichst wie
und dann die Strings mit deiner Procedure vergleichst. Vielleicht könnten dann Stringvergleiche auch schneller gemacht werden, wenn es geht.
Verfasst: 09.07.2005 13:02
von Deeem2031
Es wär eigentlich unlogisch wenn CompareMemory() dabei schneller wäre, aber es ist so...
Braucht bei 10000000 Durchläufen bei mir ca. 490 ms
Code: Alles auswählen
If CompareMemory(@Test,@"Hallo Welt!",StrLen(Test))
EndIf
CompareMemory allerdings nur 420 ms. Und das obwohl jedesmal die Länge des String noch berechnet werden muss - der String also zweimal durchlaufen wird.
Verfasst: 09.07.2005 13:34
von Deeem2031
Ich hab es jetzt sogar noch geschafft, dass die Proc nurnoch ca. 350 ms braucht:
www.deeem2031.de/Memory