ich habe mal ein kleines Problem.
Oft benötige ich nur einen boolschen Wert und um es einfacher zu machen verwende ich seit langem die beiden Funktionen im Code. Bisher hatte sie meinen Ansprüchen auch genüge getan. Jetzt habe ich allerdings ein Problem das es zuviel Zeit benötigt. Die benötigte Datenmenge fällt um einiges größer aus als die hier reservierten 3 MB.
Bei diesem Beispiel braucht mein "i7-3930K @ 4,2Ghz" mit PB5.31 x64 ca. 12,5 sek. zum schreiben und 9,6 sek. zum lesen (bei PB5.31 x86 12,5 / 10,7) beides allerdings mit IDE-Debugger... würde bei der zu erwartenden Datenmenge dann 24 Std. zum schreiben benötigen
Ich möchte hier nicht Streiten ob Prozeduren dafür Sinnvoll sind oder nicht ... aber es geht um viele, sehr viele, einzelne Bits die an vielen verschiedenen Stellen im Code gesetzt werden müssen.
Jetzt meine eigentliche Frage ... kann jemand ein paar Tipps/Anregungen geben wie es schneller geht ... ASM wäre vermutlich die schnellste Möglichkeit, doch davon hab' ich keine Ahnung. Liege ich richtig, wenn ich davon ausgehe das Mod() und Pow() am längsten benötigen? Wie könnte man es ohne machen?
Code: Alles auswählen
EnableExplicit
Procedure BitRead(*var, pos)
If PeekB(*var + Int(pos / 8)) & Int(Pow(2,Mod(pos, 8)))
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure BitWrite(*var, pos, value = 1)
*var + Int(pos / 8)
If value = #False
PokeB(*var, PeekB(*var) & ~Int(Pow(2,Mod(pos, 8))))
ProcedureReturn #False
ElseIf value = #True
PokeB(*var, PeekB(*var) | Int(Pow(2,Mod(pos, 8))))
ProcedureReturn #True
EndIf
EndProcedure
#memspace = 3000000
Define *test = AllocateMemory(#memspace, #PB_Memory_NoClear)
Define i.l
Define test1start = ElapsedMilliseconds()
For i = 0 To MemorySize(*test) * 8 - 1
BitWrite(*test, i)
Next
Define test1endtest2start = ElapsedMilliseconds()
For i = 0 To MemorySize(*test) * 8 - 1
BitRead(*test, i)
Next
Define test2end = ElapsedMilliseconds()
MessageRequester("Bit-Test", "Schreiben: " + Str(test1endtest2start - test1start) + " / Lesen: " + Str(test2end - test1endtest2start))