Pointer schneller als Variable?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

Pointer schneller als Variable?

Beitrag von Tommy »

Ich habe gehört oder mal gelesen zu haben dass Pointer deutlich schneller sind als Variablen. Weil ich noch nie Pointer benutzt habe wollte ich mal ein Geschwindigkeitstest durchführen um zu schauen wie groß der Zeitunterschied ist aber mit meinen Code kann ich keinen Speed Unterschied feststellen. :?: Oder messe ich die Zeit falsch?
Hier mein Code

Code: Alles auswählen

Structure MyStructure
Integer.i
String.s
Float.f
EndStructure
Define i, StartTime1, StartTime2, ElapsedTime1, ElapsedTime2, Resultat.s
Define Struct.MyStructure, *Struct.MyStructure = AllocateStructure(MyStructure)
;===========================================================================
StartTime1 = ElapsedMilliseconds()
For i=1 To 5000000
Struct\String = "abcdefghijklmnopqrstuvwxyz"
Struct\Integer = Random(123456789)
Struct\Float = Random(123456789)
Next
ElapsedTime1 = ElapsedMilliseconds()-StartTime1
;===========================================================================
StartTime2 = ElapsedMilliseconds()
For i=1 To 5000000
*Struct\String = "abcdefghijklmnopqrstuvwxyz"
*Struct\Integer = Random(123456789)
*Struct\Float = Random(123456789)
Next
ElapsedTime2 = ElapsedMilliseconds()-StartTime2
;===========================================================================
Resultat + "Variablezugriffe brauchten: " + Str(ElapsedTime1) + Chr(13)
Resultat + "Pointerzugriffe brauchten: " + Str(ElapsedTime2)
MessageRequester("Resultat", Resultat, 0)
FreeStructure(*Struct)
Resultat:

Code: Alles auswählen

Variablezugriffe brauchten: 689
Pointerzugriffe brauchten: 694
5.000.000 Zugriffen kein Unterschied wozu noch angeblich 'schnellere' Pointer? Oder mache ich was falsch?
Debugger war natürlich OFF!
Zuletzt geändert von Tommy am 27.01.2015 10:57, insgesamt 2-mal geändert.
PB 5.41 x64
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Pointer schneller als Variable?

Beitrag von STARGÅTE »

Aus allem "scheiß" n Pointer zu machen ist auch quatsch.

In deinem Fall wäre ein Pointer sogar langsammer, weil Struct\Integer eine direkte Adresse ist und *Struct\Integer eine doppelte Addresse (eine zu *Struct und eine zu Struct\Integer) ist.
Außerdem sind deine Beispielfunktionen (Random()) erheblich Langsammer als er zugriff auf Variablen/Pointer.

Von daher: ja, du machst was falsch.

Pointer sind zB dafür gedacht um die Zugirff auf ein "schwer" erreichbares Objekt zu beschleunigen.
zB auf ein Listen Element (das man sonst mit NextElement oder SelectElement() suchen müsste).
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
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: Pointer schneller als Variable?

Beitrag von Chimorin »

Listen mit ca. 150 Eintraegen sind mit Zeigern deutlich schneller zu verarbeiten (Wie Stargate sagte). Ich habe meine 3D-Objektlisten auch umstellen müssen, da es bei Zugriffen auf die Liste zu merklichen Stockungen kam.
Bild

- formerly known as Bananenfreak -
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

Re: Pointer schneller als Variable?

Beitrag von Tommy »

STARGÅTE hat geschrieben:Aus allem "scheiß" n Pointer zu machen ist auch quatsch.
Sehe ich genauso aber viele benutze immer nur weil man glaubt es sei immer schneller.
STARGÅTE hat geschrieben:Außerdem sind deine Beispielfunktionen (Random()) erheblich Langsammer als er zugriff auf Variablen/Pointer.
Sorry das war nur ein Beispiel. Wenn ich normale Nummer eingebe ist es auch nicht viel anders.
Kannst du für mich ein kleines Beispiel basteln damit man sehen kann wie effektv und schnell die Pointerzugriffe im Vergleich zu normanen Variablen ist? Danke :)
Zuletzt geändert von Tommy am 27.01.2015 10:56, insgesamt 2-mal geändert.
PB 5.41 x64
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Pointer schneller als Variable?

Beitrag von STARGÅTE »

Tommy hat geschrieben:Kannst du für mich ein kleines Beispiel basteln damit man sehen kann wie effektv und schnell die Pointerzugriffe im Vergleich zu normanen Variablen ist?
Du hast vermutlich den "Kern" von Pointern/Zeigern immer noch nicht ganz verstanden.

Eine Variable ist ein direkter Zugriff auf den Speicher und den Inhalt der Variable.
Das ist das "schnellste" was möglich ist.
Ein Pointer/Zeiger ist eine Art Lesezeichen oder ein Link zu einem Ort im Speicher wo ein Bestimmter Inhalt steht.

Wenn du nun eine Liste hast, und möchtest dir ein bestimmtes Element merken, kannst du dir den Index merken.
Das ist wie die Seitenzahl in einem Buch. Um die Seite zu finden, muss du Seite für Seite durchgehen bis du bei der gewünschten Seite angekommen bist.
Du kannst dir aber auch ein Lesezeichen an die Seite kleben (ein Pointer setzen).
So kannst du deine Seite direkt über dieses Lesezeichen aufschlagen ohne blättern zu müssen.
Also Zeitersparniss.

Ein CodeBeispiel aus dem Hut zu zaubern ist immer etwas kompilierter, solange es kein "sinnvollen" Zweck hat.
Es wäre andersrum besser, wenn du einen Code zeigst, und "wir" sagen können wo ein Zugriff über Pointer sinnvoll wäre.
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
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

Re: Pointer schneller als Variable?

Beitrag von Tommy »

Danke STARGÅTE für deine ausführliche Antwort. Super erklärt :)
1. Wenn ich die Zielspeicheradresse im Pointer habe und ich verschiebe die Listeneinträge (andere Reihenfolge), zeigt mein Pointer danach immer noch auf den richtigen Eintrag oder ändert sich die Adresse weil mein Eintrag woanders liegt?
2. Ursprünglich wollte ich nur wissen um wie viel schneller Pointer sind weil ich oft Codes sehe in denen bei Strukturen Pointer verwendet werden. Aber nun weiss ich dass man Pointer nur dann einsetzen soll wenn man die Position eines Eintrages unbestimmt und beliebig sein kann und man einen direkt Zugriff ohne Suchen oder Blättern braucht. Danke für deine Erklärung!
Zuletzt geändert von Tommy am 27.01.2015 10:56, insgesamt 2-mal geändert.
PB 5.41 x64
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Pointer schneller als Variable?

Beitrag von STARGÅTE »

1. Die Adresse eines Listen-Elements ändert sich nicht bzw nie, solange es existiert, egal ob Elemente davor hinzukommen oder verschwinden.
2. In den Code wo du Pointer siehst, sind sie meinst Pflicht, weil es sich zB um Procedure-Parameter handelt. Dort kannst du keine komplette strukturierte Variable übergeben sonden nur den Zeicher zum Speicherort. Pointer werden also meist aus notwendigkeit und bequemlichkeit eingesetzt, und dem daraus resultierenden schnelleren Zugriff.
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
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: Pointer schneller als Variable?

Beitrag von mhs »

Ich hab mal dein Beispiel etwas umgebaut, welches dir die Verwendung eines Zeigers in Verbindung mit einer Liste vielleicht etwas klarer macht:

Code: Alles auswählen

Structure MyStructure
  Integer.i
  String.s
  Float.f
EndStructure

Define i, StartTime1, StartTime2

NewList Struct.MyStructure()
Define *Gemerkt.MyStructure

;===========================================================================
For i=1 To 5000000

  AddElement(Struct())

  If i = 4900000
    Struct()\String = "Ganz was besonderes"
    *Gemerkt = @Struct()
  Else
    Struct()\String = "abcdefghijklmnopqrstuvwxyz"
  EndIf
  
  Struct()\Integer = Random(123456789)
  Struct()\Float = Random(123456789)

Next
;===========================================================================
StartTime1 = ElapsedMilliseconds()
ForEach Struct()
  If Struct()\String <> "Ganz was besonderes" : Continue : EndIf
  Debug "Schleife - Integer: " + Str(Struct()\Integer) + " Zeit: " + Str(ElapsedMilliseconds()-StartTime1)
  Break
Next
;===========================================================================
StartTime2 = ElapsedMilliseconds()
Debug "Pointer - Integer: " + Str(*Gemerkt\Integer) + " Zeit: " + Str(ElapsedMilliseconds()-StartTime2)
;===========================================================================
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
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: Pointer schneller als Variable?

Beitrag von ts-soft »

@mhs

Na ja, Beispiele zur Zeitmessung mit Debugger sind nicht so sinnvoll, obwohl es in diesem Falle,
wohl nicht so tragisch ist.

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
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: Pointer schneller als Variable?

Beitrag von mhs »

Das ganze Beispiel ist nicht besonders sinnvoll und soll ja eigentlich nur einen möglichen Einsatzzweck eines Pointers zeigen ... :D
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Antworten