Lange Initialisierungszeit der ArrayList, wie vermeiden?

  • Hallo Forum,
    ich wollte gerade ein paar Performance Sachen mit einer ArrayList messen, da fiel mir auf, dass der erste Durchlauf immer eine feste Zeit mehr dauert, als die anderen Durchläufe.
    Daraufhin schaute ich nach, woran es liegt, und stelle mit entsetzen fest, dass das Einfügen des Ersten (!) Elements in eine Liste ~120 ms dauert.
    Folgendes Snippet:

    AutoIt
    Global $AList = ObjCreate("System.Collections.ArrayList")
    Global $Liststarttimer = TimerInit()
    $AList.add("Some Data")
    ConsoleWrite("Initialization Time: " & TimerDiff($Liststarttimer) & @CRLF)
    Global $NextElementTimer = TimerInit()
    $AList.add("Some other Data")
    ConsoleWrite("Second Write Time: " & TimerDiff($NextElementTimer) & @CRLF)

    Ich würde euch bitten, das einmal auszuführen und mir die Zeit mitzuteilen.

    Ferner noch:
    Es ist unerheblich, ob man danach noch eine ArrayList anlegt, welche ganz anderen Speicher hat, oder diese hier genannte wieder nutzt. Lediglich der allererste Zeitpunkt im Script dauert solange, danach dauert es (bei mir) 0.04 ms für einen Datensatz.

    Also die Frage: Wie kann man das umgehen? 120ms sind eine echt hohe Zeit, die man nicht unbedingt zu verschenken hat.

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Beim ersten Durchlauf des Skripts dauert es 32ms, danach nur mehr 2-3ms.
    Hängt vermutlich damit zusammen, dass Windows zuerst die System.Collections einrichten muss.

  • Hups, ich meinte eigentlich einen anderen Effekt.
    Habe das Script mal angepasst, mein Output war:

    Code
    Initialization Time: 131.291690614278
    Second Write Time: 0.039498008305156

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • 1. Durchgang:
    Initialization Time: 20.5824686318203
    Second Write Time: 0.0463892725012603

    2. Durchgang:
    Initialization Time: 2.81496673930214
    Second Write Time: 0.0377682572576633

    Windows 7 64 bit, AutoIt 3.3.12.0 (aber mit 3.3.15.0 fast gleich schnell).
    Ich vermute Windows Initialisierungs Overhead :/

  • Initialization Time: 48.1170888974373
    Second Write Time: 0.0556868348262534

    Initialization Time: 4.37654558443699
    Second Write Time: 0.065944935978458

    Ich vermute Windows Initialisierungs Overhead

    hmmm, wer weiß, wie das ablauftechnisch umgesetzt ist...knapp Faktor 100 ist schon eine Hausnummer!

  • knapp Faktor 100

    Es ist eher Faktor 1k, zumindest beim 1. Durchgang.

    Ich muss kurz fragen, erster und zweiter Durchgang: Ihr lasst das Script einmal, und direkt danach nochmal laufen? Bei mir gibt es dort nämlich keine Zeitdifferenz. Gibt es doch, Frage erübrigt sich.
    Wäre dennoch durchaus interessant, wie man den Spaß umgehen kann.
    Gut okay, da es sich mit den X Millisekunden um eine einmalige Zeit handelt, ist das durchaus egal für den weiteren Verlauf des Programms, aber schön ist es trotzdem nicht.

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Code
    Initialization Time : 12.3057350945263
    First Write Time    : 1.58978499292244
    Second Write Time   : 0.0186291191761843
    Third Write Time    : 0.0135211348859402


    =============================================================================================
    Habs auch mal mit AutoHotkey probiert:

    Spoiler anzeigen
    Code
    Initialization Time : 10.9521
    First Write Time    :  0.3085
    Second Write Time   :  0.0036
    Third Write Time    :  0.0020


    Erstelle ich das Array aber auf normalem Wege (ohne System.Collections.ArrayList) sieht es ganz normal aus

    Spoiler anzeigen
    Code
    Initialization Time : 0.0007
    First Write Time    : 0.0006
    Second Write Time   : 0.0002
    Third Write Time    : 0.0002

    8 Mal editiert, zuletzt von kaesereibe (13. September 2016 um 09:04)