Increment, Decrement
Verfasst: 03.01.2009 17:20
In meinen Sources muss ich immer wieder (wie die meiste ^^) eine Variable oder einen Zeiger Inkrementieren oder Dekrementieren (also z.B. x+1, x-1). Nun hab ich mir dafür Macros geschrieben, Inc(), Dec(), IncP(), DecP() die dasselbe in ASM machen. Und siehe da, das ganze ist sogar schneller als mit PB. Das ganze funktioniert mit Pointern und Integern unter 32 und 64 Bit:
Bei mir:
PB: 1907 ms
ASM - Macros: 1297 ms
Resultat: ASM ca. 1/3 schneller
Code: Alles auswählen
Macro IncP(_Var)
CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
!INC dword[p.p_#_Var]
CompilerElse
!INC qword[p.p_#_Var]
CompilerEndIf
EndMacro
Macro DecP(_Var)
CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
!DEC dword[p.p_#_Var]
CompilerElse
!DEC qword[p.p_#_Var]
CompilerEndIf
EndMacro
Macro Inc(_Var)
CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
!INC dword[p.v_#_Var]
CompilerElse
!INC qword[p.v_#_Var]
CompilerEndIf
EndMacro
Macro Dec(_Var)
CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
!DEC dword[p.v_#_Var]
CompilerElse
!DEC qword[p.v_#_Var]
CompilerEndIf
EndMacro
#Test = 1000000
Procedure Test()
TestString.s = "Das ist ein TestString 0"
*char.Character
For i = 1 To #Test
*char = @TestString
While *char\c<>'0'
*Char + 1
Wend
Next
EndProcedure
Procedure Test2()
TestString.s = "Das ist ein TestString 0"
*char.Character
For i = 1 To #Test
*char = @TestString
While *char\c<>'0'
IncP(char)
Wend
Next
EndProcedure
t = ElapsedMilliseconds()
Test()
t = ElapsedMilliseconds()-t
MessageRequester("Time", Str(t))
t = ElapsedMilliseconds()
Test2()
t = ElapsedMilliseconds()-t
MessageRequester("Time", Str(t))
PB: 1907 ms
ASM - Macros: 1297 ms
Resultat: ASM ca. 1/3 schneller