Ich habe mal einen unoptimierten Vergleichtstest geschrieben.
Die Version mit ReverseString ist ca. 4 mal schneller. Aber da geht bestimmt noch was, weil... bin gerade aus dem Bett gefallen, habe das noch mit dicken Klüsen schnell eingehackt und wie gesagt nicht weiter optimiert.
Als zu analysierende Source-Grundlage habe ich den Code aus diesem Beitrag benutzt ("Date64 written by Wilbert"):
https://www.purebasic.fr/english/viewto ... df#p478507
Also genau den Date64 Code, der in meinem Beitrag dort eingebunden ist.
Den müsstest ihr euch runterladen und als D:\source.txt speichern. Oder halt woanders hin und den Pfad im folgenden Codeschnippsel anpassen. Nicht vergessen den Debugger zu deaktivieren, sonst wird die Zeitmessung ungenau.
Kiffis Version braucht bei mir ca. 1,1 Sekunden. Die mit ReverseString ca. 0,27 Sekunden (bei jeweils 1000 Durchläufen)
Ach so: Ein wichtiger Unterschied ist allerdings, dass Kiffis Version die aktuelle Zeilennummer benötigt, die ReverseString()-Version aber die aktuelle Cursorposition!
Die ReverseString()-Version spiegelt den Source bei diesem Test in jedem Durchlauf erneut. Das kann RSBasic vermutlich optimieren, denn wenn sich die Länge des Source nicht verändert, dann wird sich darin wahrscheinlich auch nichts verändert haben. In dem Fall muss man den bereits gespiegelt vorliegenden Source nicht erneut spiegeln.
Gruß Kurzer
Code: Alles auswählen
EnableExplicit
Define.s sSourcecode.s, sProcedure
Define.i iStartTime, iCount
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Windows
#LineFeed = #CRLF$
CompilerDefault
#LineFeed = #LF$
CompilerEndSelect
Procedure.s RemoveLeadingWhitespaceFromString(InString.s)
While Left(InString, 1) = Chr(32) Or Left(InString, 1) = Chr(9)
InString = LTrim(InString, Chr(32))
InString = LTrim(InString, Chr(9))
Wend
ProcedureReturn InString
EndProcedure
Procedure.s Kiffi(sText.s, iCursorLine)
Protected.s Line
Protected.i LineCounter
For LineCounter = iCursorLine - 1 To 1 Step - 1
Line = RemoveLeadingWhitespaceFromString(StringField(sText, LineCounter, #LineFeed))
If Left(LCase(Line), Len("endprocedure")) = "endprocedure"
Break
EndIf
If Left(LCase(Line), Len("procedure")) = "procedure"
If Left(LCase(Line), Len("procedurereturn")) <> "procedurereturn"
;MessageRequester("You are here:", Line)
ProcedureReturn Line
Break
EndIf
EndIf
Next
EndProcedure
Procedure.s Kurzer(sText.s, iCursorPosition)
Protected.i iPos, iTextLen = Len(sText)
Protected.s sReversText
sReversText = ReverseString(sText)
iPos = FindString(sReversText, "erudecorP", iTextLen - iCursorPosition)
If iPos > 0
iPos = iTextLen - iPos - 9 ; 9 damit "Procedure" noch mit eingeschlossen wird
ProcedureReturn Mid(sText, iPos, FindString(sText, #LineFeed, iPos) - iPos)
EndIf
EndProcedure
; source.txt sollte der PB Code aus diesem Beitrag sein:
; https://www.purebasic.fr/english/viewtopic.php?p=478507&sid=5017a3101a227e8c633c827f390b9cdf#p478507
; Also bitte vorher aus dem Forum kopieren und als Datei speichern
If ReadFile(0, "D:\source.txt")
sSourcecode = ReadString(0, #PB_File_IgnoreEOL)
CloseFile(0)
Else
MessageRequester("Laden des Sourcecodes", "Kann die Datei nicht finden!", 0)
EndIf
; Kiffi
iStartTime.i = ElapsedMilliseconds()
For iCount = 0 To 1000
sProcedure = Kiffi(sSourcecode, 600)
Next iCount
MessageRequester("Kiffi", sProcedure + #LineFeed + Str(ElapsedMilliseconds() - iStartTime))
;Kurzer
iStartTime.i = ElapsedMilliseconds()
For iCount = 0 To 1000
sProcedure = Kurzer(sSourcecode, 27418)
Next iCount
MessageRequester("Kurzer", sProcedure + #LineFeed + Str(ElapsedMilliseconds() - iStartTime))