Re: Geschwindigkeit
Verfasst: 21.11.2012 10:59
Ohne Source und Testdaten auf jeden Fall.lite hat geschrieben:Ich weiss, ist echt schwer, darauf eine Anwort geben zu können.
Stell doch mal das ganze Scenario zur Verfügung.
Ohne Source und Testdaten auf jeden Fall.lite hat geschrieben:Ich weiss, ist echt schwer, darauf eine Anwort geben zu können.
Wir können nicht wissen, was du gemacht hast. Ohne denlite hat geschrieben:Saß gestern 3 Stunden davor um das Problem zu finden.
Bin echt ratlos. Kann es an der Gui liegen ? Irgendwas bremst.
Benute XP Support und Unicode.
Ich weiss, ist echt schwer, darauf eine Anwort geben zu können.
Schön, und genau daran erkenne ich, dass du es mit dem Debugger gestartet hast (so sieht es jedenfalls aus).lite hat geschrieben:Hab das gestern getestet. Die Auswirkungen sind im Millisekunden bereich.
Als ich die Funktionen miteinander verglich und in eine For Next Schleife steckte, ca. 100 000 aufgerufen, hab.
Ergab sich ein Unterschied von 570 Ms zu 340 Ms für deine Funktion.
Code: Alles auswählen
Procedure.s StringStrip(str$)
; stringstripleft (unicode)
res$=""
For x =0 To Len(str$)*2 Step 2
uni=PeekU(@str$+x)
If uni>32
res$=Mid(str$,1+(x/2))
Break
EndIf
Next
; stringstripright (unicode)
str$=""
res$= ReverseString(res$)
For x =0 To Len(res$)*2 Step 2
uni=PeekU(@res$+x)
If uni>32
str$=Mid(res$,1+(x/2))
Break
EndIf
Next
str$= ReverseString(str$)
ProcedureReturn str$
EndProcedure
Structure CharacterArray
c.c[0]
EndStructure
Procedure.s StringStrip2(*Char.CharacterArray)
Protected Length.i = MemoryStringLength(*Char)-1
Protected Index.i = 0
While *Char\c[Index] <= 32
Index + 1
Wend
While *Char\c[Length] <= 32
Length - 1
Wend
ProcedureReturn PeekS(@*Char\c[Index], Length-Index+1)
EndProcedure
#Size = 1000000
Define String.s = #TAB$+#TAB$+" Tabs und Leerzeichen"+#TAB$+" "
Time = ElapsedMilliseconds()
For n = 1 To #Size
StringStrip(String)
Next
Time1 = ElapsedMilliseconds()-Time
Time = ElapsedMilliseconds()
For n = 1 To #Size
StringStrip2(@String)
Next
Time2 = ElapsedMilliseconds()-Time
MessageRequester("Testergebnis", "Time1: "+Str(Time1)+Chr(10)+"Time2: "+Str(Time2))
Wenn du mit GUI deine eigene Ausgabe während der Ausführung meinst, dannn ganz klar ja.lite hat geschrieben:Bin echt ratlos. Kann es an der Gui liegen ? Irgendwas bremst.
Code: Alles auswählen
EnableExplicit
Define File$ = "d:\Dateiman\TotalCmd\wincmd.ini"
Define Section$ = "user"
#anzahl = 100
; ----------------------------------------------------------
Procedure ReadSection1(File$, Section$)
Protected Text$, l, *mem, fmt
If ReadFile(0, File$)
l = Lof(0)
If l
*mem = AllocateMemory(l + 2)
If *mem
fmt = ReadStringFormat(0)
ReadData(0, *mem, l)
Text$ = PeekS(*mem, -1, fmt)
FreeMemory(*mem)
EndIf
EndIf
CloseFile(0)
EndIf
Protected n, i, zeile$, sec
If Text$
Section$ = LCase("[" + Section$ + "]")
n = CountString(Text$, #LF$) + 1
For i = 1 To n
zeile$ = StringField(Text$, i, #LF$)
If Left(zeile$, 1) = "["
zeile$ = LCase(Trim(zeile$, #CR$))
If zeile$ = Section$
sec = 1
Else
sec = 0
EndIf
ElseIf sec = 1
zeile$ = Trim(zeile$, #CR$)
Debug zeile$
EndIf
Next i
EndIf
EndProcedure
; ----------------------------------------------------------
Procedure ReadSection2(File$, Section$)
Protected fmt, zeile$, sec, res$
Section$ = "[" + LCase(Section$) + "]"
If ReadFile(0, File$)
fmt = ReadStringFormat(0)
While Not Eof(0)
zeile$ = ReadString(0, fmt)
If Asc(zeile$) = '['
zeile$ = LCase(zeile$)
If zeile$ = Section$
sec = 1
Else
sec = 0
EndIf
ElseIf sec = 1
Debug zeile$
EndIf
Wend
CloseFile(0)
EndIf
EndProcedure
; ----------------------------------------------------------
Define i
OpenConsole()
; ----------------------------------------------------------
Debug "-------"
; Ini-Datei als String Einladen und mit Stringfield Zeilen lesen
Define t = ElapsedMilliseconds()
For i = 0 To #anzahl
ReadSection1(File$, Section$)
Next i
PrintN(Str(ElapsedMilliseconds() - t))
; ----------------------------------------------------------
Debug "-------"
; Ini-Datei Zeilenweise lesen
Define t = ElapsedMilliseconds()
For i = 0 To #anzahl
ReadSection2(File$, Section$)
Next i
PrintN(Str(ElapsedMilliseconds() - t))
Input()
Ich weiß.bobobo hat geschrieben:Such mal in der Hilfe nach Preference
PB kann von sich aus mit üblichen ini-Dateien umgehen
na sowas ..lite hat geschrieben:Hallo bobobo,
die standart Preference nützt nix, da sie kein unicode verarbeiten kann.
Code: Alles auswählen
;Compileroptionen "Unicode Executable erstellen" gesetzt
;IDE-compiler :"Text des Quellcodes" UTF-8
OpenPreferences("d:\fat.ini")
PreferenceGroup("Texte")
WritePreferenceString("ClemensVonBrentano","Das Märchen von dem Schulmeister Klopfstock und seinen fünf Söhnen")
ClosePreferences()
ReadFile(0,"D:\Fat.ini")
Select ReadStringFormat(0)
Case #PB_Ascii : Debug "Kein BOM gefunden. Dies kennzeichnet üblicherweise eine normale Textdatei."
Case #PB_UTF8 : Debug "UTF-8 BOM gefunden."
Case #PB_Unicode: Debug "UTF-16 (Little Endian) BOM gefunden."
Case #PB_UTF16BE: Debug "UTF-16 (Big Endian) BOM gefunden."
Case #PB_UTF32 : Debug "UTF-32 (Little Endian) BOM gefunden."
Case #PB_UTF32BE: Debug "UTF-32 (Big Endian) BOM gefunden."
EndSelect
CloseFile(0)