Beschleunigtes Modulo für x % const(2^n)
Verfasst: 03.03.2013 03:38
Ein kleines Macro um Modulo - Befehle durch 2. - Potenzen zu beschleunigen. Die Aufruf - Konvention mit der Resultat - Variable als Parameter mag zwar etwas eigen sein, aber nötig da das ganze in eine Procedure gepackt würde den Vorteil durch den nötigen Call wieder verlangsamen (auch wegen der fehlenden Möglichkeit des Inlining im PB - Compiler). Das ganze hat natürlich nur Sinn wenn man massiv Gebrauch von solchen Modulos macht, aber in gewissen Mathematischen Berechnungen kann das schon mal der Fall sein. In meinen Messungen war das Ganze ~ 15% schneller als der native Modulo - Operator:
Code: Alles auswählen
; Modulo Beschleuniger für x % const(2^n)
Macro fastmod(_res, _num, _mod)
CompilerIf Defined(__fm_mod, #PB_Variable) = #False
Define.i __fm_mod, __fm_num, __fm_tmp
CompilerEndIf
__fm_mod = (_mod) - 1
__fm_num = _num
__fm_tmp = __fm_num & __fm_mod
If __fm_num < 0
If __fm_tmp
_res = (__fm_tmp | ~__fm_mod)
Else
_res = 0
EndIf
Else
_res = __fm_tmp
EndIf
EndMacro
#n = 100000000
t = ElapsedMilliseconds()
For i = 1 To #n
x = i%8
Next
t1 = ElapsedMilliseconds()-t
t = ElapsedMilliseconds()
For i = 1 To #n
fastmod(x, i, 8)
Next
t2 = ElapsedMilliseconds()-t
MessageRequester("","native: " + t1 + " ms" + Chr(13) +"fastmod: " + t2 + " ms")