Variablen und Geschwindigkeit

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Variablen und Geschwindigkeit

Beitrag von Imhotheb »

Hallo Zusammen,

ich hab hier mal wieder einen Geschwindigkeitstest:

Code: Alles auswählen

EnableExplicit
DisableDebugger

#Rounds = 1000000


Define i, j, a.a, u.u, l.l, q.q
Define t1, t2, t3, t4, t5

t1 = ElapsedMilliseconds()

For j = 1 To #Rounds
  For i = 0 To 120
    a = i
    a + 1
    a * 2
    a - 2
    a / 2
  Next i
Next j

t2 = ElapsedMilliseconds()

For j = 1 To #Rounds
  For i = 0 To 120
    u = i
    u + 1
    u * 2
    u - 2
    u / 2
  Next i
Next j

t3 = ElapsedMilliseconds()

For j = 1 To #Rounds
  For i = 0 To 120
    l = i
    l + 1
    l * 2
    l - 2
    l / 2
  Next i
Next j

t4 = ElapsedMilliseconds()

For j = 1 To #Rounds
  For i = 0 To 120
    q = i
    q + 1
    q * 2
    q - 2
    q / 2
  Next i
Next j

t5 = ElapsedMilliseconds()

MessageRequester("Var-Test", "Byte......: " + Str(t2 - t1) + Chr(10) +
                             "Word......: " + Str(t3 - t2) + Chr(10) +
                             "Long (i32): " + Str(t4 - t3) + Chr(10) +
                             "Quad (i64): " + Str(t5 - t4))
Die Ergebnisse unterscheiden sich doch sehr ... vorallem zwischen 32Bit und 64Bit.
Beide wurden auf einem Win7/64Bit getestet.

Bei 32Bit:
Byte: 611
Word: 594
Long: 521
Quad 2706

bei 64Bit:
Byte: 1556
Word: 1523
Long: 1530
Quad: 1324

Ich wusste ja, das der Int die schnellste Variable ist, aber ist 32Bit da wirklich so viel schneller? Fast das Doppelte ... bis auf Quad natürlich
Wenn man nicht viele Quads braucht sollte man dann nicht doch besser 32Bit benutzen? Selbst der Quad ist ja bei 64Bit langsamer als ein Byte bei 32Bit.
weil einfach einfach einfach ist ... mach' ich es anders
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Variablen und Geschwindigkeit

Beitrag von ts-soft »

DisableDebugger ist falsch/unnötig, Debugger wirklich ausschalten!

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Variablen und Geschwindigkeit

Beitrag von NicTheQuick »

Denk dran, dass i und j auch einmal 32 Bit und einmal 64 Bit sind. Unter Linux kann ich es leider nicht testen, da hier nur 64-Bit-Programme laufen.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Variablen und Geschwindigkeit

Beitrag von ts-soft »

Für einen Test ob 32-Bit oder 64-Bit schneller sind, ist es übrigens ungeeignet. 64-Bit nutzt zum Beispiel "FASTCALL", das heißt die
ersten Parameter 4 Parameter einer Procedure o. ä. werden in Registern übergeben, anstatt über den Stack. Dies ist natürlich schneller
als z.B. StdCall bei 32-Bit.

Das einzige Resultat aus dem Test ist IMHO, Integer ist der Schnellste, was mir aber vorher schon klar war.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Variablen und Geschwindigkeit

Beitrag von STARGÅTE »

Meiner Meinung nach ist dieser Test und das Resultat nutzlos.

Unter 32 bzw. 64 Bit CPUs sind die Wortgrößen nun mal 32 oder eben 64 Bit.
Somit sind Operationen (wie Plus, Minus oder Mal) auf beiden System mit der jeweiligen passenden Wortgröße gleich schnell!
Also Long auf 32Bit gleich schnell wie Quad auf 64bit.
Hier ein Code zu testen ist quatsch, weil eine Schleife um diesen Code herrum viel mehr Zeit verbraucht als die eigentliche Operation und das Ergebnis komplett verzerrt wird.
Die Division von zwei Ganzzahlen ist für CPUs etwas komplizierter, sodass hier die Länge der Variable (Länge in Bits) überhaupt erst eine Rolle spielt und es hier dann wirklich so ist, dass Long schneller ist als Quad, egal welches System.

Da nun die Division aber etwa 25-50 mal länger braucht als eine Addition, wird dein Ergebnis natürlich wieder komplett verfälscht, wenn du alle Operationen betrachtest.
Integer instructions hat geschrieben: Instruction Latency
ADD, SUB 1
MUL, IMUL 2-4
DIV r8/m8 15
DIV r16/m16 23
DIV r32/m32 39
DIV r64/m64 71
http://www.agner.org/optimize/instruction_tables.pdf
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Re: Variablen und Geschwindigkeit

Beitrag von Imhotheb »

Danke für die vielen und schnellen Antworten.

Debugger war natürlich aus, hatte eine Exe für die Ergebnisse.

Das war nur mal so "in den Raum geschmissen". Eigentlich wollte ich für mich nur wissen wie schnell ein Int ist, um besser zwischen Speicherverbrauch und CPU-Auslastung entscheiden zu können. Ja, schon klar, meistens nicht wirklich wichtig :roll:

Aber jetzt verstehe ich den Zusammenhang.

Aber dennoch ist 32Bit bei diesen Operationen (auch wenn sie Sinnfrei sind) schneller, das hatte mich stutzig gemacht.
weil einfach einfach einfach ist ... mach' ich es anders
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Variablen und Geschwindigkeit

Beitrag von ts-soft »

Imhotheb hat geschrieben:Debugger war natürlich aus, hatte eine Exe für die Ergebnisse.
Naja, das DisableDebugger im Code läßt einen leicht anderes vermuten, vielleicht nächstes mal weglassen.
Ausserdem galt der Hinweis ja nicht nur Dir, sondern allen anderen auch, die Testen. Die Unterschiede sind
"himmelweit" :D
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Re: Variablen und Geschwindigkeit

Beitrag von Imhotheb »

wenn ich ehrlich bin wusste ich das auch nicht ... benutze das Schlüsselwort nicht, da ich den Debugger immer in der IDE abschalte wenn ich ihn nicht brauche ... aber danke für den Hinweis
weil einfach einfach einfach ist ... mach' ich es anders
Antworten