Performance bei strings kopieren

  • Hallo Zusammen,

    gibt es eine schnellere Methode um strings miteinander zu verbinden als:

    [autoit]

    $sString_ges = $sString_1 & $sString_2

    [/autoit]

    ?

    Mein Code sieht in etwa so aus:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Path to hex-file/s-record
    $sFilepath = FileOpenDialog("Choose hex file", @ScriptDir, "hex/s-rocord (*.hex; *.s19; *.mot)")
    If @error Then Exit MsgBox(4096,"ERROR","Reading sourcefile failed!!!")

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

    ; Handle to hex-file/s-record
    $hFile = FileOpen($sFilepath, 0)

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

    $sRaw = ""

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

    $begin = TimerInit()

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

    while 1

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

    $string= FileReadLine($hFile)
    If @error = -1 Then ExitLoop

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

    ; String is Data Record in hex format
    If StringMid($string, 1, 1) = ":" AND StringMid($string, 8, 2) = "00" Then

    $sRaw = $sRaw & StringMid($string,10, "0x" & StringMid($string, 2, 2)*2)

    EndIf

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

    Wend

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

    ConsoleWrite(TimerDiff($begin) & @CRLF)

    [/autoit]

    Bei einem File, das ca. 1Mb groß ist, dauert es bereits ca. 12 Sekunden auf meinem Rechner. Bei 3Mb schon ca. 90 Sekunden.

    Einer ne Idee?

    Gruß...

  • Vielleicht ist es schneller mit DllStructs einen Buffer zu erstellen und mit inline-assembler die Strings zu verbinden und dann wieder in eine richtige Variable zu schreiben.
    Sicher bin ich mir aber nicht.

    Ansonsten hilft nur Programmiersprache zu wechseln oder mit C++ DLLs schreiben und verwenden.

  • Hallo dustmaster,

    das Performance-Problem kommt nicht vom Verketten sondern vom zeilenweise einlesen. Teste einmal dieses Skript:

    [autoit]

    ;#include <File.au3>

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

    Path to hex-file/s-record
    $sFilepath = FileOpenDialog("Choose hex file", @ScriptDir, "hex/s-rocord (*.hex; *.s19; *.mot)")
    If @error Then Exit MsgBox(4096, "ERROR", "Reading sourcefile failed!!!")

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

    $sRaw = ""

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

    $begin = TimerInit()
    Local $aFile[1]
    _FileReadToArray($sFilepath, $aFile)
    If Not @error Then
    For $i = 1 To $aFile[0]
    ; String is Data Record in hex format
    $string = $aFile[$i]
    If StringMid($string, 1, 1) = ":" And StringMid($string, 8, 2) = "00" Then

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

    $sRaw = $sRaw & StringMid($string, 10, "0x" & StringMid($string, 2, 2) * 2)

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

    EndIf
    Next
    EndIf
    ConsoleWrite(TimerDiff($begin) & @CRLF)

    [/autoit]

    mfg autoBert

  • Danke Euch beiden!

    Ohne, dass ich das Skript gerade testen kann behaupte ich jetzt mal, dass es nicht wirklich schneller ist. Kommentiere ich das Verbinden der Sttings aus, läuft es innerhalb weniger Milli Sekunden durch.

    Ich werde es aber noch testen und ne rückmeldung geben.

  • $sRaw = $sRaw & StringMid($string,10, "0x" & StringMid($string, 2, 2)*2)

    Ohne zu Testen, fällt mir eines auf: Was machst Du mit "0x" im Count-Parameter (3te) der StringMid-Funktion ?

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Zitat von Micha_he

    Ohne zu Testen, fällt mir eines auf: Was machst Du mit "0x" im Count-Parameter (3te) der StringMid-Funktion ?


    An der 3. und 4. Stelle steht die länge der für mich relevanten Daten im String.

    • Offizieller Beitrag

    Was hällst du davon und eine Beispielsdatei zu geben? Damit hört das Rätselraten auf. ;)


  • An der 3. und 4. Stelle steht die länge der für mich relevanten Daten im String.

    Das der 3. Parameter die Länge ist, steht ja in der AutoIt-Hilfe. Ist mir also Klar.
    Aber warum gibts Du den Parameter in Binär/Hexform an ?

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Format der Datei, die ich einlsesen will

    :20016000911000FDDA00D9FF3BD834FF911000FD8200D9FF5C6A820189F04009911000FD48

    Länge des Data Record
    Adresse
    Record Type
    Data Record
    Checksumme

    Also ein normales hex file im intel Format.

    An Stelle 2 und 3 steht die Länge des Data Record als hex Wert (hatte vorhin fälschlicherwiese 3 und 4 angegeben). Diese Länge ist variabel. Mit StringMid extrahiere ich nur den Data Record, dazu muss ich ja wissen, wie lange der Data Record wirklich ist....und dass mach ich mit:

    [autoit]

    "0x" & StringMid($string, 2, 2)*2

    [/autoit]


    Angehängt ein Besipiel - File