Seite 1 von 2

CRC64

Verfasst: 10.10.2006 00:23
von msschulte
Tach!

Hab wieder ne neue UserLibrary mit FASM gemacht:
http://home.arcor.de/msschulte/crc64iso3309.zip

CRC64 nach ISO 3309 (finde den Polynom persönlich nich so doll).
Wenn ich das richtig verstanden habe benutzt SWISS-PROT + TREMBL
den Algo um schnell Unterschiede zwischen DNA bzw. DNS zu erkennen.
Würde ja eher andere Hash-verfahren empfehlen aber
die Länge von 64bit macht ihn für manche Dinge dennoch interessant.

Verfasst: 10.10.2006 00:41
von AND51
Hallo!

Toll, wie du dich ins zeug legst! :allright:

Frage: Sind die UserLibs für PB 3.94, 4.00 oder beide geeignet? und eine kleine Befehlsreferenz wär nicht schlecht!

Verfasst: 10.10.2006 00:52
von Frogger
Ohne das testen zu wollen, wie schnell ist es im Vergleich zu CRC32 von PB?

Verfasst: 10.10.2006 01:14
von msschulte
Die ist für PB 4.00, unter 3.94 hab ich sie nicht getestet.
Solang sich die Aufrufkonvention nicht geändert hat ist die Lib abwärtskompatibel.
Für die Befehlsreferenz am besten Beispiele ansehen, erklärt sich eigentlich selbst.

Thema Geschwindigkeit (auf meiner Mühle):

PureBasic CRC32Fingerprint: 275.42 mb/s
Mein CRC32: 394.76 mb/s
Mein CRC64: 352.37 mb/s

Es sollte um 500 mb/s drin sein aber PB lag't aus mir unbekanntem Grund.

Verfasst: 10.10.2006 13:35
von msschulte
Hab endlich raus wohin die Performance verschwand.

Bisher sah das bei mir so aus:

Code: Alles auswählen

crc32 = CRC32(@buffer, Len(buffer), crc32)
Dachte es läg evtl. an Len() von PB und hab das mal genauer untersucht:

Code: Alles auswählen

Len: ;(stdcall)
    mov     eax, [esp+4]
    test    eax, eax
    jz      Len_Exit
    mov     edx, [esp+4]
    or      eax, -1
Len_NextByte:
    inc     eax
    cmp     byte [edx+eax], 0
    jnz     Len_NextByte
    retn    4
Len_Exit:
    xor     eax, eax
    retn    4
Die ist zwar nicht perfekt aber die Geschwindigkeit ist in Ordnung.
Lösung war mal wieder einfacher als man selbst glauben mag.
Ich bin wohl etwas VC++ verwöhnt, PB nimmt keine autom. Optimierung vor.

Bestimmt man die Länge nur einmal:

Code: Alles auswählen

length.l = Len(buffer)
...
crc32 = CRC32(@buffer, length, crc32)
.. hatt man auch die volle Leistung:

PureBasic CRC32Fingerprint: 337.84 mb/s
Mein CRC32: 532.78 mb/s
Mein CRC63: 458.17 mb/s

Wenn man Prüfsummen von Dateien gewinnen möchte sind die Unterschiede wohl unerheblich,
hierbei wird das Ganze dann sowieso von der Festplatte aus gebremst. :wink:

Verfasst: 10.10.2006 16:54
von msschulte
Hab im Zuge dessen mal ne optimierte Length-Funktion gemacht.

Wenn sich jemand dafür interessiert:
http://home.arcor.de/msschulte/strlen.zip

PB Len: 1560.98 mb/s
strlen: 4376.07 mb/s

Verfasst: 10.10.2006 17:09
von nco2k
wow, nicht schlecht. :o

wenn du dich so gut mit asm auskennst, warum kontaktierst du nicht einfach fred und zeigst ihm, wo er was optimieren kann/soll. :wink:

ps: deine strlen funktion gibt immer 1 zurück, wenn unicode aktiviert ist.

c ya,
nco2k

Verfasst: 10.10.2006 17:17
von msschulte
nco2k hat geschrieben:ps: deine strlen funktion gibt immer 1 zurück, wenn unicode aktiviert ist.
Jup, die ist nur für ASCII gemacht. :D

Verfasst: 10.10.2006 19:08
von HeX0R
Auch andere versuchen sich an Len().

Man muss übrigens nicht aus allem und jedem eine Lib machen, da ist mir der andere Len-Beitrag mit offenem Source irgendwie sympathischer.
Aber das ist Geschmacksache :mrgreen: .

Verfasst: 10.10.2006 19:51
von msschulte
HeX0R hat geschrieben:Man muss übrigens nicht aus allem und jedem eine Lib machen, da ist mir der andere Len-Beitrag mit offenem Source irgendwie sympathischer.
Aber das ist Geschmacksache :mrgreen: .
Richtig, Geschmackssache - und OpenSource ist nicht mein Geschmack.
Die LIB ist auch vielmehr für Versuchszwecke..