ini zu langsam, Alternative zu ini

  • Hallo ihr,


    gibt es eine schnellere Alternative als die ini-Datei?


    Die Inistruktur entspricht genau dem was ich brauche, nur leider sind die Datensätze mitlerweile so groß geworden das das Einlesen merklich länger dauert.


    Oder gibt es eine andere Art des Einlesens?


    Bsp.: Ich habe 100 Sections mit je 20 Values, um nach einer Spalte sortieren zu können muß ich nun 2000 Values einlesen (theoretisch nur 100x20, da ich aber nach der Sortierung die anderen Values mit anzeige, lese ich alle restlichen values je section mit ein)


    Oder statt sortieren, wenn ich nur die Datensätze anzeigen will deren Value mit einer Bedingung übereinstimmt und es wird z.B. nur von einem section erfüllt....muß ich um dies herauszufinden trotzdem alle einlesen, gibt es da Möglichkeiten?


    Vielen Dank für eure Hilfe

  • Alternative wäre sqlite.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Hi,
    Sinn und Zweck einer INI ist das INI-tialisieren von Daten beim Programmstart. Eine INI ist nicht primär dazu gemacht, als Datenbank zu fungieren. Wobei ich mich aber wundere, da der Inhalt einer kürzlich gelesenen Datei eigentlich im Cache steht und von dort aus extrem fix gelesen wird...
    Ausser du schreibst einen Wert und damit den kompletten Datei-Inhalt bei jedem Schreibvorgang auf die Platte, aber wer macht sowas?

    Verfahren:
    Dateiinhalt der INI beim Programmstart in den Speicher lesen, Daten im Speicher bearbeiten (Schreiben/Lesen) und dann die Daten beim Beenden des Programms wieder in die INI-Datei schreiben. So wirds gemacht, und das ist superschnell, da völlig unabhängig vom Datenformat der Datei....

  • Hallo habenureinproblem,

    Normalerweise sind INIs sehr schnell, die richtige Handhabung vorausgesetzt. Nimmst du denn nicht IniReadSection? Um es besser beurteilen zu können, wäre es nützlich wenn du die INI's mit Beispieldaten einstellst,

    mfg autoBert

  • Erstmal danke schön für eure Antworten

    Ja also ich muß zugeben ich missbrauche die ini als datenbank, einfach weil bestimmte funktionen halt schon gegenben sind, wie z.B. wenn die section schon enthalten ist, wird nur der value wert aktualisiert oder hinzugefügt und das nur durch den einen Befehl iniwrite; für mich kompfortabler.

    Wegen dem Ablauf....1. Lade Seite 2. Daten parsen 3. in ini speichern 4.1-3 mehrmals wiederholen 5. zusammenfassung (ini wird geladen und in listview ausgegeben)

    mehr ist es nicht.....und das speichern geht sehr schnell nur halt das ausgeben der ini in dem listview dauert immer länger und länger, da die daten nun mal immer mehr werden. Dabei muß ich per inireadsection alles auslesen, da die Daten etwa diese Form haben:

    [D234 2424234 867654]
    Ko=2424234
    Ki=867654
    Gr=55555
    GF=2323

    möglicherweise liegt es aber am listview?....je mehr daten drin sind desto langsamer wird es?

    Nagut...ich schaue mir mal externe Datenbanken an die ich mit autoit ansprechen kann.......muß jetzt aber erstmal zur arbeit....ich schaue morgen nochmal rein

  • Wenn du die Daten nur zur Laufzeit brauchst ist der Umweg über eine Datei garnicht notwendig.
    Speicher die geparsten Daten lieber in Arrays und erstelle dann daraus dein ListView. Mit _Arrayadd oder _ArrayInsert kann man bequem neue Einträge hinzufügen.
    Bei Bedarf kann beim Programmende natürlich auch der Inhalt der Arrays in eine Textdatei / ini Datei geschrieben werden (_filewritefromarray) und beim nächsten start mit _filereadtoarray einmalig wieder eingelesen werden.
    Für Arrays gibt es auch sehr gute Funktionen, wie arraysearch oder diverse sortierfunktionen. Um dir die Sucherei in den Arrays nach irgendwelchen Sektionen zu sparen könntest du auch für jede Sektion ein eigenes Array verwenden. (ok bei 100 Sektionen eher ungeeignet)

    2 Mal editiert, zuletzt von misterspeed (2. Dezember 2010 um 20:37)

  • Also so wie du das beschreibst denke ich nicht das dich die ini ausbremst sondern deine Listview.
    Generell gilt:
    BuntiBunti-KlickiKlicki ist nicht unbedingt das schnellste.

    Um wieviele Einträge handelt es sich denn ungefähr? Reden wir hier von 100 oder 1000 oder 1Millionen?
    Natürlich würde eine Datenbank auch mehr Performance bringen aber um wirklich Zeit zu sparen musste warscheinlich das Erstellen der Listview optimieren.

  • Zitat

    Bsp.: Ich habe 100 Sections mit je 20 Values, um nach einer Spalte sortieren zu können muß ich nun 2000 Values einlesen (theoretisch nur 100x20, da ich aber nach der Sortierung die anderen Values mit anzeige, lese ich alle restlichen values je section mit ein)

    Ich denke mal 2000 :>


    LG

  • Zitat

    Ich denke mal 2000 :>

    Gut gerechnet Watson :D

    Bleibt nur die Frage ob es nur ein Beispiel ist oder wirklich das was er hat.
    2000 Inieinträge wäre jetzt ja nicht wirklich viel, das Auslesen sollte doch recht fix gehn

  • Guten Morgen, habe heute mal nachgeschaut, es sind genau 240 sections mit je 21 (aber noch steigend) values

    habe eben die komplette Func per Timer gemessen.

    Der komplette Datensatz einlesen, berechnen und in einem Listview ausgeben (wobei dort nicht alle 21 values gelistet werden) hat etwa um die 3,3 sek gedauert, danach habe ich das erstellen der listviewitems rausgenommen und bin auf eine Zeit um die 1,5 sek gekommen.

    Bei 100 Datensätzen dauerte es mit listview 1,2 seks ohne etwa 0,4 seks.

    nochmal zusammengefasst:

    240 datensätze = 3,3 (mit listview) 1,5 (ohne listview)
    100 datensätze = 1,2 (mit listview) 0,4 (ohne listview)

    hmm vielleicht bin ich da zu oberflächlich rangegangen und habe die ini beschuldigt, obwohl ich mir listview genauer ansehen müßte.

    Ich werde erstmal paar Test durchführen, mit dem einmal einlesen bis zum Beenden vom Programm. Da würde ich die oben genannten 3,3 Sekunden nur einmal am Start haben, was verschmerzbar ist, denke ich mal.
    Oder ich schaue mir auch mal das von euch genannte SQLite an.

    Ich hatte am Anfang die Daten in 2 txt-Dateien aufgeteilt, sozusagen die sections in der einen, die values in der anderen. Vielleicht sollte ich das auch mal testen, ob es dort einen Geschwindigkeitszuwachs gibt.

    Und ich werde die Ausgabe vom Listview noch weiter begrenzen, also alle nicht relevanten nicht als item erzeugen lassen.

    Gut habe ich erstmal was zu tun.....ich danke euch für eure Unterstützung.

    Wem noch etwas einfällt, immer her damit :)

  • Zitat

    Bei 100 Datensätzen dauerte es mit listview 1,2 seks ohne etwa 0,4 seks.

    Mach dir mal Gedanken über ein "passendes" Dateiformat. Eine mehrere MB große Datei ist in Mikrosekunden in den Speicher zu laden. Um 1000 Datensätze in ein Array zu packen braucht AutoIt auch nur einige Millisekunden.
    Alternativ könntest du, wenns wirklich auf Geschwindigkeit ankommt, den Dateiinhalt in eine Struct schreiben und hast somit 2 Fliegen mit einer Klappe geschlagen.
    Da dllstructgetdata() genauso schnell ist wie der Zugriff auf ein Array, ist der gesamte Aufwand (Daten schreiben in Array) eingespart.

    Zitat

    wenn du mal ein Testset bauen/beschreiben könntest, dann könnte man einen kleinen Contest machen, wie es schnell geht :)

    DAFÜR! :thumbup:

    /EDIT/ Das Listview ist leider der Flaschenhals, hab da schon einiges versucht um Geschwindigkeit rauszuholen (auch in Assembler), leider erfolglos, da die Windowsfunktionen (API) sehr aufwendig sind.

    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 (3. Dezember 2010 um 11:20)

  • So habe mal kurz was zum Testen erstellt...

    Mit erstellen, wird die Inidatei erstellt. (damit gleiche Verhältnisse sind).
    Mit berechnen werden die Daten die relevant sind gelesen, berechnet und ausgegeben.
    Also zum Testen brauchen wir nur den berechnen-Button.


    ...in etwa so funktioniert mein Programm(nur das halt nicht immer die ganze Ini erstellt wird, sondern nur um geänderte Werte aktualisiert wird).

    Das berechnen habe ich immo genau so bei mir drin....aus ini einlesen (was hier iniread mit ner for schleife und $k steht, habe ich bei mir einzelene inireads, da ich keine Zahlen sondern Namen als keys habe), dann alles berechnen, Bedingungen abfragen usw. und als Listviewitem ausgeben.


    [autoit]

    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>

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

    $Form1 = GUICreate("Form1", 625, 443, 192, 124)
    $button_erstellen = GUICtrlCreateButton("erstellen", 64, 40, 89, 25, $WS_GROUP)
    $button_berechnen = GUICtrlCreateButton("berechnen", 328, 40, 105, 25, $WS_GROUP)
    $listview_anzeige = GUICtrlCreateListView("1|2|3|4|5|6|7|8|9|10|11|12|13|14|15", 88, 88, 345, 225)
    $label_zeit = GUICtrlCreateLabel("Zeit", 100, 350)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $button_erstellen
    _erstellen()
    Case $button_berechnen
    _berechnen()
    EndSwitch
    WEnd

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

    Func _erstellen()
    For $j = 1 To 200
    For $k = 1 To 30
    IniWrite("geschwindigkeitstest.ini", $j, $k, Random(1, 20000, 1))
    Next
    Next
    EndFunc ;==>_erstellen

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

    Func _berechnen()
    $timer1 = TimerInit()
    Dim $vars[31]
    $maximal = IniReadSectionNames("geschwindigkeitstest.ini")
    For $j = 0 To $maximal[0]
    For $k = 0 To 30
    $vars[$k] = IniRead("geschwindigkeitstest.ini", $j, $k, 0)
    Next
    $test1 = $vars[1] * $vars[4]
    $test2 = $vars[2] * $vars[5]
    $test3 = $vars[3] * $vars[6]
    $test4 = $vars[4] * $vars[7]
    $test5 = $vars[5] * $vars[4] / $vars[1] * $vars[9]

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

    $item = GUICtrlCreateListViewItem($test1 & "|" & $test2 & "|" & $test3 & "|" & $test4 & "|" & $test5 & "|", $listview_anzeige)
    Next
    GUICtrlSetData($label_zeit, TimerDiff($timer1))
    EndFunc ;==>_berechnen

    [/autoit]
  • Hallo habenureinproblem,

    löse es doch indem du die ganze Section einliest:

    Spoiler anzeigen
    [autoit]

    Func _berechnen()
    _GUICtrlListView_DeleteAllItems($listview_anzeige)
    $timer1 = TimerInit()
    Dim $vars[31]
    $maximal = IniReadSectionNames("geschwindigkeitstest.ini")
    For $j = 1 To $maximal[0]
    $vars = IniReadSection("geschwindigkeitstest.ini",$j)
    ; _ArrayDisplay($vars)
    $test1 = $vars[1][1] * $vars[4][1]
    $test2 = $vars[2][1] * $vars[5][1]
    $test3 = $vars[3][1] * $vars[6][1]
    $test4 = $vars[4][1] * $vars[7][1]
    $test5 = $vars[5][1] * $vars[4][1] / $vars[1][1] * $vars[9][1]

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

    $item = GUICtrlCreateListViewItem($test1 & "|" & $test2 & "|" & $test3 & "|" & $test4 & "|" & $test5 & "|", $listview_anzeige)
    Next

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

    GUICtrlSetData($label_zeit, TimerDiff($timer1))
    EndFunc ;==>_berechnen

    [/autoit]

    auch diese Änderung bringt noch ein paar MilliSekunden:

    [autoit]

    Case $button_berechnen
    _GUICtrlListView_BeginUpdate($listview_anzeige)
    _berechnen()
    _GUICtrlListView_EndUpdate($listview_anzeige)

    [/autoit]

    Beide Änderungen zusammen komme ich jetzt auf unter 1 sec.

    mfg autoBert

    Einmal editiert, zuletzt von autoBert (5. Dezember 2010 um 23:17)

  • ohne grossartig regexp() auszupacken, 15x schneller durch simple Stringfunktionen
    Bei mir dauerte das Orginal mit den IniRead() ca 3 Sekunden, allein die Listview dabei 0,5 Sekunden.
    Berechnung also ca 2.5 Sekunden.
    Wird nun in ca 150ms erledigt (plus die Anzeige in der Listview):

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <Array.au3>

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

    $Form1 = GUICreate("Form1", 625, 443, 192, 124)
    $button_erstellen = GUICtrlCreateButton("erstellen", 64, 40, 89, 25, $WS_GROUP)
    $button_berechnen = GUICtrlCreateButton("berechnen", 328, 40, 105, 25, $WS_GROUP)
    $listview_anzeige = GUICtrlCreateListView("1|2|3|4|5|6|7|8|9|10|11|12|13|14|15", 88, 88, 345, 225)
    $label_zeit = GUICtrlCreateLabel("Zeit", 100, 350)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $button_erstellen
    _erstellen()
    Case $button_berechnen
    _berechnen()
    EndSwitch
    WEnd

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

    Func _erstellen()
    For $j = 1 To 200
    For $k = 1 To 30
    IniWrite("geschwindigkeitstest.ini", $j, $k, Random(1, 20000, 1))
    Next
    Next
    EndFunc ;==>_erstellen

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

    Func _berechnen()
    $timer1 = TimerInit()
    $inhalt = FileRead("geschwindigkeitstest.ini")
    Dim $vars[31]
    StringReplace($inhalt, "]", "]")
    $maximal = @extended ;IniReadSectionNames("geschwindigkeitstest.ini")
    For $j = 0 To $maximal
    $a = StringInStr($inhalt, "]" & @CRLF, 1, $j + 1) ;position ]
    $b = StringInStr($inhalt, "[", 1, $j + 2) ;position [
    if $b=0 then $b=stringlen($inhalt) ;letzte
    $str = StringMid($inhalt, $a + 1, $b - $a - 1)
    $split = StringSplit($str, @CRLF, 3)
    For $k = 1 To 30
    $vars[$k] = stringtrimleft($split[$k],stringinstr($split[$k],"="));IniRead("geschwindigkeitstest.ini", $j, $k, 0);
    Next
    $test1 = $vars[1] * $vars[4]
    $test2 = $vars[2] * $vars[5]
    $test3 = $vars[3] * $vars[6]
    $test4 = $vars[4] * $vars[7]
    $test5 = $vars[5] * $vars[4] / $vars[1] * $vars[9]

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

    $item = GUICtrlCreateListViewItem($test1 & "|" & $test2 & "|" & $test3 & "|" & $test4 & "|" & $test5 & "|", $listview_anzeige)
    Next
    GUICtrlSetData($label_zeit, TimerDiff($timer1))
    EndFunc ;==>_berechnen

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Hallo,

    ich habe mir auch mal die Mühe gemacht das etwas zu beschleunigen.
    Nach meinen Test ist die Lösung die Schnellst (bis jetzt)

    200 Sektionen;
    Org 7204 7587
    1 575 531
    2 571 494
    3 400 385

    2000 Sektionen:
    org - -
    1 21892 22013
    2 12795 11932
    3 3981 3564

    Änderung der Serstellen Funktion;

    Spoiler anzeigen
    [autoit]

    Func _erstellen()
    if FileExists("geschwindigkeitstest.ini") then FileDelete("geschwindigkeitstest.ini")
    Local $Outstream = ""
    For $j = 1 To 2000
    $Outstream &= "[" & $j & "]" & @CRLF
    For $k = 1 To 30
    $Outstream &= $k & "=" & Random(1, 20000, 1) & @CRLF
    Next
    Next
    FileWrite("geschwindigkeitstest.ini",$Outstream)
    EndFunc ;==>_erstellen

    [/autoit]


    Func _berechnen_3() ist meine.


    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiListView.au3>

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

    $Form1 = GUICreate("Form1", 625, 443, 192, 124)
    $button_erstellen = GUICtrlCreateButton("erstellen", 64, 40, 89, 25, $WS_GROUP)
    $button_berechnen = GUICtrlCreateButton("berechnen", 328, 40, 105, 25, $WS_GROUP)
    $listview_anzeige = GUICtrlCreateListView("1|2|3|4|5|6|7|8|9|10|11|12|13|14|15", 88, 88, 345, 225)
    $label_zeit = GUICtrlCreateLabel("Zeit", 100, 350)
    Global $tests[4][2]

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

    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $button_erstellen
    _erstellen()
    Case $button_berechnen
    $tests[0][0] = _berechnen("_berechnen_org")
    $tests[1][0] = _berechnen("_berechnen_1")
    $tests[2][0] = _berechnen("_berechnen_2")
    $tests[3][0] = _berechnen("_berechnen_3")

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

    $tests[0][1] = _berechnen("_berechnen_org", True)
    $tests[1][1] = _berechnen("_berechnen_1", True)
    $tests[2][1] = _berechnen("_berechnen_2", True)
    $tests[3][1] = _berechnen("_berechnen_3", True)
    _ArrayDisplay($tests)
    EndSwitch
    WEnd

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

    Func _erstellen()
    For $j = 1 To 200
    For $k = 1 To 30
    IniWrite("geschwindigkeitstest.ini", $j, $k, Random(1, 20000, 1))
    Next
    Next
    EndFunc ;==>_erstellen

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

    Func _berechnen($Function, $Refresh = False)
    _GUICtrlListView_DeleteAllItems($listview_anzeige)
    $timer1 = TimerInit()
    If $Refresh Then _GUICtrlListView_BeginUpdate($listview_anzeige)
    Call($Function)
    If $Refresh Then _GUICtrlListView_EndUpdate($listview_anzeige)
    $Timerdiff = TimerDiff($timer1)
    GUICtrlSetData($label_zeit, $Timerdiff)
    Return $Timerdiff
    EndFunc ;==>_berechnen

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

    Func _berechnen_org()
    Dim $vars[31]
    $maximal = IniReadSectionNames("geschwindigkeitstest.ini")
    For $j = 0 To $maximal[0]
    For $k = 0 To 30
    $vars[$k] = IniRead("geschwindigkeitstest.ini", $j, $k, 0)
    Next
    $test1 = $vars[1] * $vars[4]
    $test2 = $vars[2] * $vars[5]
    $test3 = $vars[3] * $vars[6]
    $test4 = $vars[4] * $vars[7]
    $test5 = $vars[5] * $vars[4] / $vars[1] * $vars[9]

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

    $item = GUICtrlCreateListViewItem($test1 & "|" & $test2 & "|" & $test3 & "|" & $test4 & "|" & $test5 & "|", $listview_anzeige)
    Next
    EndFunc ;==>_berechnen_org

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

    Func _berechnen_1()
    _GUICtrlListView_DeleteAllItems($listview_anzeige)
    Dim $vars[31]
    $maximal = IniReadSectionNames("geschwindigkeitstest.ini")
    For $j = 1 To $maximal[0]
    $vars = IniReadSection("geschwindigkeitstest.ini", $j)
    $test1 = $vars[1][1] * $vars[4][1]
    $test2 = $vars[2][1] * $vars[5][1]
    $test3 = $vars[3][1] * $vars[6][1]
    $test4 = $vars[4][1] * $vars[7][1]
    $test5 = $vars[5][1] * $vars[4][1] / $vars[1][1] * $vars[9][1]

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

    $item = GUICtrlCreateListViewItem($test1 & "|" & $test2 & "|" & $test3 & "|" & $test4 & "|" & $test5 & "|", $listview_anzeige)
    Next
    EndFunc ;==>_berechnen_1

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

    Func _berechnen_2()
    $inhalt = FileRead("geschwindigkeitstest.ini")
    Dim $vars[31]
    StringReplace($inhalt, "]", "]")
    $maximal = @extended ;IniReadSectionNames("geschwindigkeitstest.ini")
    For $j = 0 To $maximal
    $a = StringInStr($inhalt, "]" & @CRLF, 1, $j + 1) ;position ]
    $b = StringInStr($inhalt, "[", 1, $j + 2) ;position [
    If $b = 0 Then $b = StringLen($inhalt) ;letzte
    $str = StringMid($inhalt, $a + 1, $b - $a - 1)
    $split = StringSplit($str, @CRLF, 3)
    For $k = 1 To 30
    $vars[$k] = StringTrimLeft($split[$k], StringInStr($split[$k], "="));IniRead("geschwindigkeitstest.ini", $j, $k, 0);
    Next
    $test1 = $vars[1] * $vars[4]
    $test2 = $vars[2] * $vars[5]
    $test3 = $vars[3] * $vars[6]
    $test4 = $vars[4] * $vars[7]
    $test5 = $vars[5] * $vars[4] / $vars[1] * $vars[9]

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

    $item = GUICtrlCreateListViewItem($test1 & "|" & $test2 & "|" & $test3 & "|" & $test4 & "|" & $test5 & "|", $listview_anzeige)
    Next
    EndFunc ;==>_berechnen_2

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

    Func _berechnen_3()
    $timer1 = TimerInit()
    $inhalt = FileRead("geschwindigkeitstest.ini")
    Dim $vars[31]
    $maximal = StringRegExp($inhalt, '(\[[\w\d\s=\]]*)', 3) ;IniReadSectionNames("geschwindigkeitstest.ini")
    For $j = 0 To UBound($maximal) - 1
    ;$SectionName = StringRegExp($maximal[$j],'\[([\w\d\s=]*)',3) as array base 0
    $split = StringRegExp($maximal[$j], '[\w\d]*=([\w\d]*)\s', 3)
    For $k = 0 To 29
    $vars[$k] = StringTrimLeft($split[$k], StringInStr($split[$k], "="));IniRead("geschwindigkeitstest.ini", $j, $k, 0);
    Next
    $test1 = $vars[1] * $vars[4]
    $test2 = $vars[2] * $vars[5]
    $test3 = $vars[3] * $vars[6]
    $test4 = $vars[4] * $vars[7]
    $test5 = $vars[5] * $vars[4] / $vars[1] * $vars[9]

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

    $item = GUICtrlCreateListViewItem($test1 & "|" & $test2 & "|" & $test3 & "|" & $test4 & "|" & $test5 & "|", $listview_anzeige)
    Next
    EndFunc ;==>_berechnen_3

    [/autoit]
  • au backe, was für ein Unterschied...

    ......habe gerade mal einen Test gemacht und meine Daten mit inireadsection anstatt iniread einzulesen.... Mußte aber auch extra Kontrollen einbauen......da ab und zu einige keys in manchen sectionen nicht vorhanden sind. Inireadsection würde also als $var[4][0] z.B. GR liefern während in einer anderen Section GR erst an 5ter Stelle kommt also $var[5][0]....die Rechnung würde fehlerbehaftet sein.
    Trotzdem brachte es einfach mal über 1 Sek Ersparnis statt 3,7 war ich bei 2,4. (Meine Abfrage war ganz simpel per if $var[4][0] = "GR")

    Aber einen so starken Vorteil durch Stringexp war ich mir nicht bewußt.

    Muß mir das jetzt erstmal ganz genau anschauen.

  • Tigger1975, deine Lösung ist zwar die schnellste nur die Ergebnisse stimmen nicht.

    Hier meine Messung:

    Code
    [0]|9360.96738551967|6235.80622676904
    [1]|1018.69874523159|832.176715197043
    [2]|994.877561254293|968.083932455103
    [3]|805.46605783696|716.540230671775

    mfg autoBert