DLL aus Funktion _Arrayunique erstellen

  • Hallo,

    ich hab das Problem, das die Funktion _Arrayunique bei mehreren tausend Einträgen sehr langsam ist.
    Wenn man die Funktion als DLL einbinden würde müßte das ja um einiges schneller gehen.

    In dem Beitrag
    ArrayUnique ohne Bug´s und Schneller
    ist diese Funktion schon verbessert worden, aber bei der Geschwindigkeit hat sich bei mir nicht viel geändert.

    Kann mir bitte jemand aus dieser Funktion eine DLL erstellen die auch mit 64-Bit läuft ?

    Danke

    Gruß
    Cybercommander

    2 Mal editiert, zuletzt von Cybercommander (17. Dezember 2012 um 17:23)

  • Ein AutoIt-Array an eine DLL zu übergeben ist nicht ganz trivial.
    Im einfachsten Fall müsste man per Dllstructcreate das Array in ein C-Array umwandeln welches den korrekten Datentyp hat.
    Witzig wird es vor allem dann wenn die Elemente des Arrays Strings sind. Denn dann müsstest du ein Array von Charpointern machen welche auf die entsprechenden Strings verweisen.
    Diese Vorbereitung um alleine das Array zu übergeben ist schon so aufwendig dass es durchaus sein kann, dass du mit einer Dll nicht viel gewinnst.

    Viel cleverer wäre es doch schon beim erstellen des Arrays darauf zu achten, dass keine Einträge doppelt eingetragen werden (z.b. in dem du ein Dictionary statt einem Array nimmst).

    Und selbst wenn es wirklich überhaupt nicht anders gehen sollte könntest du noch vorher folgende Variante (nur für 1D-Arrays) probieren bevor du irgendwas in eine Dll auslagerst:

    ArrayUnique2
    [autoit]

    Func _ArrayUnique2(Const ByRef $aA)
    ; by AspirinJunkie
    Local Static $oD = ObjCreate('Scripting.Dictionary')
    For $i In $aA
    $oD($i) = 0
    Next
    Local $aR = $oD.Keys()
    $oD.RemoveAll
    Return $aR
    EndFunc ;==>_ArrayUnique2

    [/autoit]
  • Hallo AspirinJunkie,

    vielen Dank für deine Erklärung, deine Funktion ist der Hammer, statt 40 Sekunden
    brauche ich jetzt weniger als 1 Sekunde.
    Damit hat sich die DLL-Datei erledigt.

    Danke, du bist Super.

    Cybercommander