Wie Arbeitet CompareMemory() ??

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
PAMKKKKK
Beiträge: 321
Registriert: 21.04.2005 22:08
Wohnort: Braunschweig
Kontaktdaten:

Wie Arbeitet CompareMemory() ??

Beitrag 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 :cry: !
Weiss jemand ob das Teil einen Bytweisen vergleich macht und bei ungleichheit abbricht? Oder ob es mit CRC32 oder MD5 oder anders Arbeitet??
Wir Schreiben ein PureBasic Buch.
Auch du kannst mitmachen!
http://www.purearea.net/pb/english/pure ... :Main_Page
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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?
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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...
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Meine neue CompareMemory() -Proc braucht gerade einmal ein Zehntel
> der Alten.

da hört sich sehr gut an! :allright:

Nun böte sich an, dass Du Deine Änderungen an Fred weiterleitest,
damit er diese in seine Lib mit übernehmen kann.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Kannst du deine Procedure nochmal testen aber in dem du mit PB einmal 2 Strings vergleichst wie

Code: Alles auswählen

Test.s = "Hallo Welt!"
If Test = "Hallo Welt!"
EndIf
und dann die Strings mit deiner Procedure vergleichst. Vielleicht könnten dann Stringvergleiche auch schneller gemacht werden, wenn es geht.
Bild
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

:shock:
Es wär eigentlich unlogisch wenn CompareMemory() dabei schneller wäre, aber es ist so...

Code: Alles auswählen

If Test = "Hallo Welt!"
EndIf
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.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Ich hab es jetzt sogar noch geschafft, dass die Proc nurnoch ca. 350 ms braucht: www.deeem2031.de/Memory
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Antworten