ThreadSafe Performance erhöhen?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

ThreadSafe Performance erhöhen?

Beitrag von PureBasic4.0 »

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?
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag von PureBasic4.0 »

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.
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag von PureBasic4.0 »

naja, dass mit dem Mutexen ist so ne Sache...

@all: Hat jemand von euch einen Beispielcode dafür?

@Kaeru: Es muss ein String sein, da die Zahlen BriefLZ komprimiert sind...
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

Ich weis nicht ob das jetzt das richtige ist, was ich geschrieben habe.
Naja hier wird auch jeden Pixel gezeichnet :mrgreen:
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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag von PureBasic4.0 »

@RSBasic: Da das ganze aber etwas komplexer ist, brauche ich ThreadSafe.

@all: Hat jemand einen Beispielcode für Mutexes?
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

PureBasic4.0 hat geschrieben:@Kaeru: Es muss ein String sein, da die Zahlen BriefLZ komprimiert sind...
dann gibts ja immernoch die anderen beiden möglichkeiten von denen ich sprach...

außerdem:
warum ist es BriefLZ komprimiert?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag von PureBasic4.0 »

weil's kleiner ist...

aber beantwortet doch bitte mal die frage: Ich brauche ein Mutex-Beispiel. Hat schonmal jemand damit geproggt oder erfahrungen damit gesammelt?
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> 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... ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten