Pointer schneller?



  • [Framepointer + FeldOffset + Indexsizeof(Elementtyp)]
    ja, so hatte ich mir das vorgestellt. wobei FeldOffset + Index
    sizeof(Elementtyp) zur compilezeit berechnet werden kann (wenn der index bekannt ist) und [Framepointer + CONST] kann ein 8086 in einer instruktion machen, wenn mich nicht alles täuscht.

    [Pointer + Index*sizeof(Elementtyp)]
    damit bin ich auch einverstanden, allerdings benötigt das 2 zugriffe. erst [Framepointer + OffsetDesPointers] um den pointer in ein register zu bekommen und dann den obigen zugriff. und bei dem 8086 mit seiner pobligen anzahl registern wir alles im frame aufbewahrt und kommt nur in register wenn es gebraucht wird.



  • Mirauder_Mo schrieb:

    und kommt nur in register wenn es gebraucht wird.

    z.B. im inneren einer Schleife. Bei einem einzelnen Zugriff ist der eine Takt nicht im entferntesten entscheidend für die Performance.



  • Jester schrieb:

    [Wenn ich ihm einen Pointer gebe, dann weiß er doch auch Exakt wo das Element liegt (nämlich an der Adresse wo der Pointer hinzeigt).

    natürlich liegt es da wo der pointer hinzeigt, aber es wird ein zugriff gebraucht um an den pointer zu kommen und ein weiterer um an das element zu kommen. auf dem stack weis der compiler dann schon wo der pointer hinzeigt und braucht nur einen zugriff.

    Jester schrieb:

    In C++ gibts keine automatische Überprüfung des Index.

    ich würde das überprüfen des indexes, gerade bei soch einfachen überprüfungen, nicht der Programmiersprache, sondern dem Compiler überlassen. und auch wenn es die meisten c++ compiler vieleicht nicht machen (hab da keine ahnung) dann ist es eine schwache leistung.



  • Mirauder_Mo schrieb:

    [...]und auch wenn es die meisten c++ compiler vieleicht nicht machen (hab da keine ahnung) dann ist es eine schwache leistung.

    Nein, das ist C(++) in seiner reinstform in Kombination mit dem anarchistischen "ich will alles machen können, wann ich will, und ich weiss was ich tue" bzw. dem "brauchts nicht, kann man ja alles mit Sprachmitteln nachbilden" gefasel vieler C(++) programmierer.

    Wenn du sowas überprüft haben willst, wechsel die Sprache. Ada kann sowas z.B. ganz gut (o;

    -junix



  • Mirauder_Mo schrieb:

    Jester schrieb:

    In C++ gibts keine automatische Überprüfung des Index.

    ich würde das überprüfen des indexes, gerade bei soch einfachen überprüfungen, nicht der Programmiersprache, sondern dem Compiler überlassen. und auch wenn es die meisten c++ compiler vieleicht nicht machen (hab da keine ahnung) dann ist es eine schwache leistung.

    wie soll das ein compiler machen, ohne waehrend er runtime zu checken - und das wollen wir ja nicht. (keine kosten fuer etwas, das wir nicht brauchen)

    deshalb kann sich jeder eine eigene klasse schreiben, die bereichsuerbpruefung macht, oder nicht. (je nachdem was man gerade braucht)



  • Shade Of Mine schrieb:

    wie soll das ein compiler machen, ohne waehrend er runtime zu checken

    *hust* äääh bei einem statischen Array und sowas wie oben (statischer Zugriff) sollte man doch meinen, dass man keinen Runtime-Check braucht... Erfolgt der Zugriff mit einer Indexvariablen (wie häufig der fall) dann hast du selbstverständlich recht...

    -junix



  • Bashar schrieb:

    Mirauder_Mo schrieb:

    und kommt nur in register wenn es gebraucht wird.

    z.B. im inneren einer Schleife. Bei einem einzelnen Zugriff ist der eine Takt nicht im entferntesten entscheidend für die Performance.

    natuerlich hast du damit recht, aber wenn in der selben schleife noch ein funktionsaufruf gemacht wird, oder andere etwas umfangreicheren operationen, dann ist es vorbei damit das man den pointer die ganze zeit in einem register lassen kann. (wieviele arbeitsregister hat ein 8086?)



  • Du kannst es drehen und wenden wie du willst, je mehr du in der Schleife machst, desto unwichtiger wird der eine Takt, den das Pointer laden kostet. Je weniger du machst, desto wahrscheinlicher alloziert der Compiler ein Register für den Pointer. BTW der 80x86 hat 6 Arbeitsregister -- eax, ebx, ecx, edx, esi, edi.



  • Mirauder_Mo schrieb:

    natuerlich hast du damit recht, aber wenn in der selben schleife noch ein funktionsaufruf gemacht wird, oder andere etwas umfangreicheren operationen, dann ist es vorbei damit das man den pointer die ganze zeit in einem register lassen kann. (wieviele arbeitsregister hat ein 8086?)

    6 Arbeitsregister und das ist verdammt wenig 🙂 Aber in dem Moment wo du eine Unterfunktion aufrufst, provozierst du sowieso einen ganzen Haufen weitere Speicheraufrufe, die zwar wohl aus dem Cache bedient werden können aber das gilt für den Pointer auch 🙂 Der Unterschied wird daher marginal sein.



  • Schade. Meine Idee, wieso Stack-Zugriff _minimalst_ (!) schneller ist war ja, dass auf den Stack permanent zugegriffen wird und er daher auch wahrscheinlicher gecached wird als irgendein Inhalt auf dem weit verteilten Heap.


Anmelden zum Antworten