Optimierte Purebasic-Libraries
Verfasst: 13.07.2005 18:39
Da der alte Thread im Anfänger-Forum (http://forums.purebasic.com/german/viewtopic.php?t=3921) nicht mehr wirklich zum Thema passte, eröffne ich hiermit einen neuen Thread. Und möchte auch gleich meine neuste Errungenschaft vorstellen 
Ich hab nämlich den Vergleich zweier Strings (If String1 = String2) optimiert und brauche ein bischen mehr als halb so viel Zeit und ein bischen weniger als meine CompareMemory-Procedure.
Wer sich selbst davon überzeugen will: www.deeem2031.de/SYS_StringEqual
Dazu muss ich aber sagen, das es zwar eine ganz normale PB-Library ist. Es aber kein sauberer Code ist, ehrlich gesagt hab ich mich sogar sehr gewundert, dass es funktioniert hat ^^ Es müsste nämlich durch das hinzufügen der Library ein Label doppelt sein, was aber anscheinend ignoriert wird.
Um den neuen Verlgeich dann nutzen zu können, muss man irgendwo (es ist völlig egal wo, selbst nach einem "End" müsste es funktionieren) "Init_SYS_StringEqual()" aufrufen. Diese Procedure macht allerdings absolut nichts, desswegen ist es auch egal wo man sie einfügt. Ohne die Procedure wird allerdings weiterhin der alte Vergleich aufgerufen.
Für alle die, die das jetzt nicht kapiert haben
Alt:
Neu:
Bei mir braucht der alte Vergleich ca. 1000 ms, der neue nur ca. 600 ms.
PS.: Hab vorgestern, neben der Memory und Math Lib, auch angefangen die StringExtension Lib zu optimieren. Das dauert aber noch ein bischen.
Ich hab nämlich den Vergleich zweier Strings (If String1 = String2) optimiert und brauche ein bischen mehr als halb so viel Zeit und ein bischen weniger als meine CompareMemory-Procedure.
Wer sich selbst davon überzeugen will: www.deeem2031.de/SYS_StringEqual
Dazu muss ich aber sagen, das es zwar eine ganz normale PB-Library ist. Es aber kein sauberer Code ist, ehrlich gesagt hab ich mich sogar sehr gewundert, dass es funktioniert hat ^^ Es müsste nämlich durch das hinzufügen der Library ein Label doppelt sein, was aber anscheinend ignoriert wird.
Um den neuen Verlgeich dann nutzen zu können, muss man irgendwo (es ist völlig egal wo, selbst nach einem "End" müsste es funktionieren) "Init_SYS_StringEqual()" aufrufen. Diese Procedure macht allerdings absolut nichts, desswegen ist es auch egal wo man sie einfügt. Ohne die Procedure wird allerdings weiterhin der alte Vergleich aufgerufen.
Für alle die, die das jetzt nicht kapiert haben
Alt:
Code: Alles auswählen
;Init_SYS_StringEqual()
SetThreadPriority_(GetCurrentThread_(),#THREAD_PRIORITY_ABOVE_NORMAL)
#r = 20000000
test.s = "Hallo Welt!"
time1 = ElapsedMilliseconds()
For i = 0 To #r
If test = "Hallo Welt!"
EndIf
Next
time1 = ElapsedMilliseconds() - time1
time2 = ElapsedMilliseconds()
For i = 0 To #r
If CompareMemory(test,@"Hallo Welt!",StrLen(test))
EndIf
Next
time2 = ElapsedMilliseconds() - time2
MessageRequester("",Str(time1)+#CRLF$+Str(time2))Code: Alles auswählen
Init_SYS_StringEqual()
SetThreadPriority_(GetCurrentThread_(),#THREAD_PRIORITY_ABOVE_NORMAL)
#r = 20000000
test.s = "Hallo Welt!"
time1 = ElapsedMilliseconds()
For i = 0 To #r
If test = "Hallo Welt!"
EndIf
Next
time1 = ElapsedMilliseconds() - time1
time2 = ElapsedMilliseconds()
For i = 0 To #r
If CompareMemory(test,@"Hallo Welt!",StrLen(test))
EndIf
Next
time2 = ElapsedMilliseconds() - time2
MessageRequester("",Str(time1)+#CRLF$+Str(time2))PS.: Hab vorgestern, neben der Memory und Math Lib, auch angefangen die StringExtension Lib zu optimieren. Das dauert aber noch ein bischen.