Seite 1 von 6

Optimierte Purebasic-Libraries

Verfasst: 13.07.2005 18:39
von Deeem2031
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:

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))
Neu:

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))
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.

Verfasst: 14.07.2005 01:38
von Deeem2031
Keiner dran interessiert? Hm, vielleicht sollte ich doch freaks Ratschlag folge leisten und sowas nurnoch Fred zeigen... hier scheint sich ja keiner für zu interessieren ;)

Verfasst: 14.07.2005 01:53
von MVXA
Saubere Arbeit :). Ist bei mir ca 10x schneller. PB braucht rund 3000 Millisekunden. Deine Library nur rund 300 Millisekunden. Das einzige was mich aber stört ist, dass man immer [c]Init_SYS_StringEqual()[/c] aufrufen muss. Kann man das nicht irgendwie ändern?

Edit: Hab was korrigiert

Verfasst: 14.07.2005 09:07
von Rings
Pure kann doch automatisch ne INIT-Procedur in den Libs aufrufen.(Siehe Docs zum LibMaker bzw Bsp in PBOSL ;)

Verfasst: 14.07.2005 09:16
von freedimension
Rings hat geschrieben:Pure kann doch automatisch ne INIT-Procedur in den Libs aufrufen.(Siehe Docs zum LibMaker bzw Bsp in PBOSL ;)
Ja, aber müsste er dann nicht immer noch mindestens eine Prozedur dieser Lib aufrufen damit die Initialisierung mit eingebunden wird? So wie ich den Text jetzt verstanden habe wird ja der direkte Vergleich var.s = "String" ersetzt, also nicht wirklich eine Funktion aufgerufen, oder?

Verfasst: 14.07.2005 09:51
von Kiffi
> Keiner dran interessiert?

latürnich bin ich daran interessiert! Leider habe ich momentan nicht allzuviel
Zeit, um das mal ausführlich auszuprobieren. Sorry!

Grüße ... Kiffi

Verfasst: 14.07.2005 10:08
von bluejoke
Ich bin auch interessiert, aber ich flieg in nem Monat für ein Jahr nach Ecuador, deswegn bleibt mir gerade nicht besonders viel Zeit zum Programmieren.

:allright: Ich finds auf jeden Fall Klasse, was du machst!

Simon

EDIT: Ach ja, nebenbei hab ich jetzt Schule, und muss los :)

Verfasst: 14.07.2005 11:33
von Norbie
Quatsch doch mal Fred an! Du wärest doch eine echte Bereicherung! Vieleicht findet sich ein Weg, wie deiner Verbesserungen direkt in PB eingearbeidet werden können!

Verfasst: 14.07.2005 11:44
von Deeem2031
@Rings & MVXA: Die Proc ist ja nur dazu da, damit der Compiler die Library verlinkt, so wie freedimension das auch schon gesagt hat. Eine Init-Proc würde da nicht helfen. Man könnte nur die Proc in die SystemBase.lib reinschummeln (böse ;) ) oder in eine Library packen die sogut wie immer mit verlinkt wird (auch nicht wirklich das wahre).

Ihr müsst also erstmal mit "Init_SYS_StringEqual()" Leben.

Nachdem Fred ausm Urlaub zurück ist, wird er dann auch benachrichtigt, auch wenn er sowieso wieder mit "ich hab wichtigeres zu tun" antwortet ;)

[EDIT] @Norbie: Ist alles schon im Gange, nur Fred meinte halt das es zur Zeit erstmal wichtigeres gibt. Kann also vielleicht etwas dauern.

Verfasst: 14.07.2005 13:58
von dige
Ich bekomme mit den neuen Libs (memory/mathe) unter Version 3.93B2
folgende Fehlermeldung:

Code: Alles auswählen

POLINK: warning: Multiple "'.data' sections found with different flags (0xc0000040 and 0x60000040).  
POLINK: error: Unresolved external symbol '_PB_AllocateMemory'.
POLINK: error: Unresolved external symbol '_PB_FreeMemory'.
POLINK: error: Unresolved external symbol '_PB_CopyMemory'.
POLINK: fatal error: 3 unresolved external(s).