Re: Leistung mit THREADS geringer ohne?
Verfasst: 15.03.2015 15:09
Irgendiwe ist das aber alles seltsam mit den Threads ... ich habe mal folgendes probiert:
PB 5.31 x86 / Win7_64
Debugger = off
Threadsave = off
Unicode = on
CPU-Cores: 6 phy / 12 log
EDIT: Hab' den Fehler entdeckt ... in CountUp() waren die Variablen kein Quad ...
EDIT: falsche Ergebnisse gelöscht
PB 5.31 x86 / Win7_64
Debugger = off
Threadsave = off
Unicode = on
CPU-Cores: 6 phy / 12 log
EDIT: Hab' den Fehler entdeckt ... in CountUp() waren die Variablen kein Quad ...
Code: Alles auswählen
Structure ThData
Count.q
Time.i
ThID.i
EndStructure
Procedure CountUp(*ThData.ThData)
Protected z1.q, z2.q, Count.q = *ThData\Count ;EDIT .q hinzugefügt
Protected t = ElapsedMilliseconds()
Repeat ; nach Beispiel von ST4242
z1 + 1
z2 + 2
z2 = z1 * z2
z2 / 2
z2 = 0
Until z1 >= Count ; Bei Erreichen von #CountMax
*ThData\Time = ElapsedMilliseconds() - t
EndProcedure
#CountMax = 10000000000 ;zaehlen bis
#Threads = 4 ;Anzahl Threads
Dim ThData.ThData(20)
Define th, result.s, thCombTime
;Info:
result = "Zähle bis: " + Chr(9) + Str(#CountMax) + Chr(10)
result + "Threads: " + Chr(9) + Str(#Threads) + " * " + Str(#CountMax / #Threads) + Chr(10)
result + "-------------------" + Chr(10)
;Single/NoThread
ThData(0)\Count = #CountMax
CountUp(@ThData(0))
;Threads starten
For th = 1 To #Threads
ThData(th)\Count = #CountMax / #Threads
ThData(th)\ThID = CreateThread(@CountUp(), @ThData(th))
Next
;auf Threads warten / auswerten
For th = 1 To #Threads
WaitThread(ThData(th)\ThID)
result + "Thread" + Str(th) + ": " + Chr(9) + Str(ThData(th)\Time) + " ms" + Chr(10)
thCombTime + ThData(th)\Time
Next
;Thread-Gesamt
result + "-------------------" + Chr(10)
result + "AllThreads: " + Chr(216) + " " + Str(thCombTime / #Threads) + " ms" +
" / Gesamt: " + Str(thCombTime) + " ms" + Chr(10)
result + "NoThread: " + Str(ThData(0)\Time) + " ms" + Chr(10)
If MessageRequester("Thread-Test", result + Chr(10) + "Text in Zwischenablage kopieren?",
#PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
SetClipboardText(result)
EndIf