Optimierte Purebasic-Libraries

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Optimierte Purebasic-Libraries

Beitrag 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.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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 ;)
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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
Zuletzt geändert von MVXA am 15.07.2005 15:23, insgesamt 1-mal geändert.
Bild
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

Pure kann doch automatisch ne INIT-Procedur in den Libs aufrufen.(Siehe Docs zum LibMaker bzw Bsp in PBOSL ;)
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag 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?
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
Kiffi
Beiträge: 10719
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag 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 :)
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Norbie
Beiträge: 134
Registriert: 29.08.2004 12:45
Wohnort: Chemnitz
Kontaktdaten:

Beitrag 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!
http://www.nevu.de/ Künstliche Intelligenz, die letzte Herausforderung!
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
dige
Beiträge: 1246
Registriert: 08.09.2004 08:53

Beitrag 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).
"Papa, ich laufe schneller - dann ist es nicht so weit."
Antworten