ThreadSafe Performance erhöhen?
- PureBasic4.0
- Beiträge: 785
- Registriert: 29.10.2006 17:26
- Wohnort: 127.0.0.1
ThreadSafe Performance erhöhen?
Hi Leute,
ich habe jetzt ein Tool geproggt, das ziemlich viel Performance braucht (Zeichnen jedes einzelnen Pixels auf nen Screen). Wenn ich aber ThreadSafe angeschaltet habe (muss ich, sonst gibt's IMA), braucht das Programm nur 50%-max. 60% CPU-Leistung. Ohne braucht es 90%-100% und läuft um einiges schneller. Kann man da was machen, dass das Programm wieder etwas schneller läuft, oder ist das alles?
ich habe jetzt ein Tool geproggt, das ziemlich viel Performance braucht (Zeichnen jedes einzelnen Pixels auf nen Screen). Wenn ich aber ThreadSafe angeschaltet habe (muss ich, sonst gibt's IMA), braucht das Programm nur 50%-max. 60% CPU-Leistung. Ohne braucht es 90%-100% und läuft um einiges schneller. Kann man da was machen, dass das Programm wieder etwas schneller läuft, oder ist das alles?
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
kristallkugel?
ne also, müßte man schon wissen wie es aufgebaut ist.
z.b. dieses:
> Wenn ich aber ThreadSafe angeschaltet habe (muss ich, sonst gibt's IMA)
wieso IMA ohne threadsafe?
möglicherweise kann man was machen, aber was kann man unmöglich sagen,
ohne genauere informationen, was du eigentlich machst und wie du vorgehst...
ne also, müßte man schon wissen wie es aufgebaut ist.
z.b. dieses:
> Wenn ich aber ThreadSafe angeschaltet habe (muss ich, sonst gibt's IMA)
wieso IMA ohne threadsafe?
möglicherweise kann man was machen, aber was kann man unmöglich sagen,
ohne genauere informationen, was du eigentlich machst und wie du vorgehst...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
- PureBasic4.0
- Beiträge: 785
- Registriert: 29.10.2006 17:26
- Wohnort: 127.0.0.1
naja, wie der name schon sagt, habe ich einige Threads am laufen, die u.a. auf einen String zugreifen, diesen auslesen und damit halt das anstellen, was sie sollen. wie du bereits im anderen posting geschrieben hast, ist es dumm, Strings zu befüllen und gleichzeitig auszulesen (oder war es kiffi:?:). Mein Problem im anderen Posting war, dass ich immer IMAs bekomme. Habe zu dem Zeitpunkt aber noch nicht an threadsafe gedacht.
Also, ohne ThreadSafe komme ich nicht aus, es sei denn, jemand hat nen Code mit dem gleichzeitiges lesen und schreiben (oder halt knapp zeitversetztes) möglich ist.
Also, ohne ThreadSafe komme ich nicht aus, es sei denn, jemand hat nen Code mit dem gleichzeitiges lesen und schreiben (oder halt knapp zeitversetztes) möglich ist.
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
hm...
also, du brauchst gleichzeitig nen string zum hin und her shiften zwischen threads,
und performanten zugriff auf den screen....
meine frage wäre jetzt: muss es denn ein string sein?
was für informationen gibst du denn rüber...
wenn der string wirklich zur informationsübermittlung benutzt wird,
muss er ja noch interpretiert werden.
da ist es dann u.U. sinnvoller, gleich zahlen zu verwenden die eine dementsprechende bedeutung haben.
wenn es darum geht, dass thread A meldungen ausgibt, je nachdem was thread B gemacht hat,
kann thread B statt des strings eine kennummer übergeben,
und thread A sucht sich seinen string zum ausgeben aus einer tabelle.
und sogar wenn du unbedingt einen string nehmen willst...
probier mal, das problemn zu umgehen, indem du ein globales zahlenarray erstellst,
das du zum verschicken von strings verwendest.
auch eine struct mit einem fixstring darin unterliegt nicht dem stringpool problem,
was normale strings so thread-problematisch macht.
aber das ist jetzt halt alles ins blaue fabuliert, weil du ja nicht genauer sagst, was du eigentlich vorhast....
PS:
zu guter letzt müßte es auch gehen, dass du nur den stringzugriff extra mutext...
ich kenn mich da nicht so genau aus, aber ich meine mich zu erinnern,
dass die threadsafe-option dafür sorgt, dass JEDE variable ge-mutex-t wird,
was natürlich irre auf die performance drückt.
also, du brauchst gleichzeitig nen string zum hin und her shiften zwischen threads,
und performanten zugriff auf den screen....
meine frage wäre jetzt: muss es denn ein string sein?
was für informationen gibst du denn rüber...
wenn der string wirklich zur informationsübermittlung benutzt wird,
muss er ja noch interpretiert werden.
da ist es dann u.U. sinnvoller, gleich zahlen zu verwenden die eine dementsprechende bedeutung haben.
wenn es darum geht, dass thread A meldungen ausgibt, je nachdem was thread B gemacht hat,
kann thread B statt des strings eine kennummer übergeben,
und thread A sucht sich seinen string zum ausgeben aus einer tabelle.
und sogar wenn du unbedingt einen string nehmen willst...
probier mal, das problemn zu umgehen, indem du ein globales zahlenarray erstellst,
das du zum verschicken von strings verwendest.
auch eine struct mit einem fixstring darin unterliegt nicht dem stringpool problem,
was normale strings so thread-problematisch macht.
aber das ist jetzt halt alles ins blaue fabuliert, weil du ja nicht genauer sagst, was du eigentlich vorhast....

PS:
zu guter letzt müßte es auch gehen, dass du nur den stringzugriff extra mutext...
ich kenn mich da nicht so genau aus, aber ich meine mich zu erinnern,
dass die threadsafe-option dafür sorgt, dass JEDE variable ge-mutex-t wird,
was natürlich irre auf die performance drückt.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
- PureBasic4.0
- Beiträge: 785
- Registriert: 29.10.2006 17:26
- Wohnort: 127.0.0.1
Ich weis nicht ob das jetzt das richtige ist, was ich geschrieben habe.
Naja hier wird auch jeden Pixel gezeichnet
Aber nach meiner Meinung finde ich das kein Unterschied
Naja hier wird auch jeden Pixel gezeichnet

Aber nach meiner Meinung finde ich das kein Unterschied

Code: Alles auswählen
If OpenWindow(0,0,0,500,500,"Testwindow",#PB_Window_SystemMenu)
If StartDrawing(WindowOutput(0))
StartTime = ElapsedMilliseconds()
For b=1 To 500
For a=1 To 500
Plot(a,b,RGB(Random(255),Random(255),Random(255)))
Next a
Next b
StopDrawing()
Debug ElapsedTime = ElapsedMilliseconds()-StartTime
EndIf
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Zuletzt geändert von RSBasic am 22.07.2007 19:50, insgesamt 1-mal geändert.
- PureBasic4.0
- Beiträge: 785
- Registriert: 29.10.2006 17:26
- Wohnort: 127.0.0.1
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
dann gibts ja immernoch die anderen beiden möglichkeiten von denen ich sprach...PureBasic4.0 hat geschrieben:@Kaeru: Es muss ein String sein, da die Zahlen BriefLZ komprimiert sind...
außerdem:
warum ist es BriefLZ komprimiert?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
- PureBasic4.0
- Beiträge: 785
- Registriert: 29.10.2006 17:26
- Wohnort: 127.0.0.1
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
> weil's kleiner ist...
aber zur kommunikation zwischen threads?
das ist doch widersinnig. das en- und de-komprimieren dauert doch viel zu lange für sowas.
außerdem, wie groß sollen denn deine strings sein, dass du sie komprimieren musst?
mehrere MB? zur kommunikation zwischen threads? das ist doch dreifach widersinnig.
> aber beantwortet doch bitte mal die frage: Ich brauche ein Mutex-Beispiel.
Boardsuche...
aber zur kommunikation zwischen threads?
das ist doch widersinnig. das en- und de-komprimieren dauert doch viel zu lange für sowas.
außerdem, wie groß sollen denn deine strings sein, dass du sie komprimieren musst?
mehrere MB? zur kommunikation zwischen threads? das ist doch dreifach widersinnig.
> aber beantwortet doch bitte mal die frage: Ich brauche ein Mutex-Beispiel.
Boardsuche...

Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.