Seite 1 von 1

Pointer schneller als Variable?

Verfasst: 26.08.2014 09:58
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!

Re: Pointer schneller als Variable?

Verfasst: 26.08.2014 11:12
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).

Re: Pointer schneller als Variable?

Verfasst: 26.08.2014 11:17
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.

Re: Pointer schneller als Variable?

Verfasst: 26.08.2014 11:26
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 :)

Re: Pointer schneller als Variable?

Verfasst: 26.08.2014 13:35
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.

Re: Pointer schneller als Variable?

Verfasst: 26.08.2014 13:52
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!

Re: Pointer schneller als Variable?

Verfasst: 26.08.2014 14:10
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.

Re: Pointer schneller als Variable?

Verfasst: 02.09.2014 14:02
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)
;===========================================================================

Re: Pointer schneller als Variable?

Verfasst: 02.09.2014 14:32
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

Re: Pointer schneller als Variable?

Verfasst: 02.09.2014 20:36
von mhs
Das ganze Beispiel ist nicht besonders sinnvoll und soll ja eigentlich nur einen möglichen Einsatzzweck eines Pointers zeigen ... :D