BigNum - Rechnen mit großen Zahlen

  • Vor einigen Monaten hab ich angefangen meine BigNum UDF neu zu schreiben.

    Ist noch nicht fertig, aber da ich im Moment keine Zeit finde, poste ich hier mal die Beta-Version zum testen.


    Die Algos sind etwas schneller als die der alten Version:
    _BigNum_Add ca 5% schneller
    _BigNum_Sub ca 20% schneller
    _BigNum_Div ca 60% schneller!
    einzig _BigNum_Mul ist bei immer größeren Zahlen etwas langsamer, aber es wurde ein Bug beseitigt, welcher bei extrem großen Zahlen falsche Ergebnisse lieferte...

    Diese Geschwindigkeitsunterschiede sind abhängig von der Länge der Zahlen.
    Bei gewissen Situationen kann die neue Version auch etwas langsamer sein.
    Im Durchschnitt hab ich jedenfalls obige Werte gemessen.

    Wer immer schon die alte Version im Einsatz hatte, möge doch bitte die neue Version auf Fehler testen -Danke :thumbup:

    E

  • nice,
    hatte vor Jahren schon mal angefangen, einige Funktionen in asm zu schreiben...beim ADD ist es geblieben, Addition von 2 UINTs mit je 50 Millionen Ziffern dauert ca. 1 Sekunde^^

    Spoiler anzeigen
    [autoit]

    $bytecode = "0x8B7C24048B3FB800000000B9FFFFFFFFF2AE89FE83EE0283C10289CA8B7C24088B3FB800000000B9FFFFFFFFF2AE83EF0283C10239D17C0487FE87CA8D440F0150FDF8B8000000004283FA007D058A1E4EEB02B300C1E0188A0710D8370430AA4175E5FC58803830750140C3"
    $tCodeBuffer = DllStructCreate("byte[" & StringLen($bytecode) - 1 & "]") ;Speicher für den assemblercode belegen
    DllStructSetData($tCodeBuffer, 1, $bytecode) ;assemblercode in speicher schreiben

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $t = TimerInit()
    $string1 = _stringrep("1", 50000000);50 millionen einsen
    $string2 = _stringrep("9", 50000000);und neunen in strings

    [/autoit] [autoit][/autoit] [autoit]

    $fac = _bigint_add_asm($string1, $string2);addieren

    [/autoit] [autoit][/autoit] [autoit]

    $m = TimerDiff($t)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $m = ' & $m & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit]

    ;msgbox schneidet ab....
    MsgBox(262144, 'Debug line ~' & @ScriptLineNumber, 'Selection:' & @LF & '$fac' & @LF & @LF & 'Return:' & @LF & $fac) ;### Debug MSGBOX

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _bigint_add_asm($string1, $string2)
    $a = DllCall("user32.dll", "str", "CallWindowProcW", "ptr", DllStructGetPtr($tCodeBuffer), "str*", "0" & $string1, "str*", "0" & $string2, "int", 0, "int", 0);bytecode aufrufen, rückgabe in a[0]
    If @error Then Return SetError(-1, 0, -1)
    Return $a[0]
    EndFunc ;==>_bigint_add_asm

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _stringrep($s, $k)
    While StringLen($s) * 2 <= $k ;schneller ersatz für stringrepeat
    $s &= $s
    WEnd
    $s &= StringLeft($s, $k - StringLen($s))
    Return $s
    EndFunc ;==>_stringrep

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (1. Juli 2012 um 19:14)

  • Geil !

    An dem Skript sind direkt 2 Sachen unglaublich.

    1. So schnell habe ich AutoIt noch nie gesehen, wenn es um das Füllen von Arbeitsspeicher geht. (in 0,5 Sek über 700 MB^^)
    2. Ich dachte die Stings in AutoIt wären inkompatibel zu str* Da hätte ich mal nachsehen sollen. Mist^^

    Endlich eine Möglichkeit die Fibonacci Reihe mal in annehmbarem Tempo berechnen bis die Festplatte voll ist^^

  • Würde mich schon reizen, das in ASM zu schreiben...
    Aber evtl. ist es einfach besser (endlich) mal einen Wrapper für GMP.dll zu schreiben ;)
    Die Funktionen für Add und Sub (Int und FLoat) hätte ich sogar schonmal geschrieben (allerdings für eine ganz alte GMP Version aus dem Jahre 2004)

    Wenn ich Zeit finde, probier ich mich mal an der ASM-Version...

    lg
    E

  • Blume
    der Prozessor ist ein Athlon II x2 250, also Dualcore, der läuft undervolted idR mit 400 Mhz, aber wenn es sein muss, dann drehen beide Kerne bis auf 3.5Ghz hoch :rock:

    Wenn ich maximal 3Ghz nehme, dann dauert der ADD 1,4 bis 1,6 Sekunden, je nachdem was dazwischenfunkt (Interrupts FTW)

    Übrigens ist der code kein Stück optimiert sondern auf die Schnelle zusammengehackt, WENN ich optimiere, dann immer auf Takte pro Loop.
    Das kann dazu führen, dass auf anderen Prozessoren das Programm langsamer läuft, ich rede immer noch von Takten/Loop.
    Genausogut kann es sein, dass auf einer INTEL-Maschine das Programm viel schneller läuft, einfach weil der Prozessor die Pipelines anders füllt, der Cache schneller ist, oder einige Befehle besser (schneller) implementiert sind.


    eukalyptus

    Zitat

    Würde mich schon reizen, das in ASM zu schreiben...

    nachdem was ich von dir in letzter Zeit an ASM gesehen habe, wäre ich echt gespannt, das wäre eines der feinsten Programme ever ^^
    Wenn ich mich nicht irre ist sogar SSE eine Option, ADD und SUB (ggf auch MUL) mit 4 Ziffern gleichzeitig bringt mindestens Faktor 3 an Speed^^