Seite 1 von 2

Increment, Decrement

Verfasst: 03.01.2009 17:20
von cxAlex
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:

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))
Bei mir:

PB: 1907 ms
ASM - Macros: 1297 ms

Resultat: ASM ca. 1/3 schneller

Verfasst: 03.01.2009 17:25
von Fluid Byte
Ist bei mir gleich schnell. Circa ~78 auf 'nem Pentium D 3.00GHz.

Verfasst: 03.01.2009 17:26
von cxAlex
Probiers nochmal, hab den Source angepasst um besser vergleichen zu können.

Verfasst: 03.01.2009 17:31
von ts-soft
Da PB IMHO dasselbe erzeugt kann ich das auch nicht so recht glauben

Verfasst: 03.01.2009 17:36
von cxAlex
Ok. Mein Fehler. Hab den Debugger nicht aus gemacht :oops:.
Trozdem ist die ASM - Variante bei mir immer noch leicht schneller:

#Test = 10000000
PB: 469 ms
ASM: 422 ms

Verfasst: 03.01.2009 17:38
von ts-soft
PB erzeugt aber denselben ASM-Output, jedenfalls war das bisher so.

Verfasst: 03.01.2009 17:40
von cxAlex
Dazu kann ich nicht sagen weil ichs nicht weis, TROZDEM is der Code ohne Debugger bei mir 500 ms 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 = 100000000

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))
Und bevor jetzt werd sagt "Den Vorteil kann man doch nirgends spüren":
Ich hab Codes wo man das merkt, Besonders wenn man noch an anderen Stellen optimiert.

Verfasst: 03.01.2009 18:46
von c4s
...zumindest sind deine Macros bei mir auch ungefähr eine halbe Sekunde
schneller.
Naja bei 100.000.000 Loops.. :shock:

Verfasst: 03.01.2009 18:49
von Rings
Kappes.
Im Asm-Output (siehe Compilerswitch /Commented )
steht ganz klar ein INC dword[ESP+X]

das heisst es kommt immer grad an wie der cache bestückt ist.
ansonsten ist die reine PB version sogar schneller da
sie mit dem Stack (ESP) arbeitet.

Verfasst: 03.01.2009 22:19
von Oliver1994
Oh nein oh nein!

Meine Werte sind peinlich:

PB:7772
ASM:5188

^^Sorry aber mein PC ist halt nicht mehr der neuste!

Gruß

JENS