For Next Schleife mit Array

Für allgemeine Fragen zur Programmierung mit PureBasic.
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: For Next Schleife mit Array

Beitrag von ts-soft »

Von ASM verstehe ich leider nicht viel (eher garnichts :mrgreen: ),
aber wird hier nicht das Schleifenende in EAX zwischengespeichert und
mit V verglichen. Zwar wird das Register nicht runtergezählt, sondern V,
aber das sollte wurscht sein?
EAX ist aber nur 32-Bit breit, somit entspricht es meinen Vorstellungen.
Aber wie gesagt, null ahnung :lol:
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: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: For Next Schleife mit Array

Beitrag von STARGÅTE »

@CSHW89:

komisch, war das schon immer so?
Ich meine mich erinnern zu können, das bei "Einfachen" For-Schleifen direkt ein Register genutzt wurde für die Laufvariable.
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
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: For Next Schleife mit Array

Beitrag von CSHW89 »

ts-soft hat geschrieben:Von ASM verstehe ich leider nicht viel (eher garnichts :mrgreen: ),
aber wird hier nicht das Schleifenende in EAX zwischengespeichert und
mit V verglichen. Zwar wird das Register nicht runtergezählt, sondern V,
aber das sollte wurscht sein?
EAX ist aber nur 32-Bit breit, somit entspricht es meinen Vorstellungen.
Aber wie gesagt, null ahnung :lol:
Schon allerdings nur für den Vergleich. Wie du schon dagst, wird die Variable i hochgezählt, nicht eax.
STARGÅTE hat geschrieben:@CSHW89:

komisch, war das schon immer so?
Ich meine mich erinnern zu können, das bei "Einfachen" For-Schleifen direkt ein Register genutzt wurde für die Laufvariable.
Wie gesagt, hat mich auch verwundert.

lg Kevin
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: For Next Schleife mit Array

Beitrag von NicknameFJ »

STARGÅTE hat geschrieben:@CSHW89:

Ich meine mich erinnern zu können, das bei "Einfachen" For-Schleifen direkt ein Register genutzt wurde für die Laufvariable.
Das kann eigentlich nicht sein, dass der Compiler dies so optimiert. Und zwar aus folgender Überlegung heraus: Wenn die Laufvariable nur in einem Register geführt wird, hat man innerhalb der Schleife noch keinen Zugriff auf den jeweiligen Wert der PB-Variablen. Man könnte meinen dass dann der Compiler dies nur dann optimiert (=Laufvariable ausschließlich im Register hält) wenn innerhalb der Schleife nicht auf die Laufvar. zugegriffen wird. Angesicht der vielen Möglichkeiten scheint hier Prüfung ob eine Optimierung zulässig ist fast unmöglich.

Einige Varianten wo z.B. nicht optimiert werden dürfte:
Laufvariable ist eine globale Var., innerh. der Schleife wird eine andere Procedure aufgerufen, die Laufvar. könnte innerhalb der procedure auch shared sein , oder innerhalb der Schleife wird mit Gosub irgendwohin gesprungen, auch hier muss der Wert der (lokalen) Laufvar. bekannt sein; schließlich kann der Compiler nicht den Programmablauf nachvollziehen um zu sehen ob der Wert der Laufvariablen nicht während der Schleife benötigt wird.
Auch könnte es sein, dass ein Thread läuft in dem auf die ggfs. globale Laufvar. zugegriffen wird usw. Es scheint nahezu unmöglich alles zu prüfen ob nicht irgendwo der Wert der Laufvar. gebraucht wird

Grüße

NicknameFJ
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: For Next Schleife mit Array

Beitrag von STARGÅTE »

Jo hab schon mit CSHW89 geredet, ich hab wohl "damals" meine ASM Code betrachtet, wo ich genau so eine Optimierung drin hatte.
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
Ramihyn_
Beiträge: 61
Registriert: 20.06.2007 10:56

Re: For Next Schleife mit Array

Beitrag von Ramihyn_ »

ts-soft hat geschrieben:Zwar wird das Register nicht runtergezählt, sondern V,
aber das sollte wurscht sein?
Registerzugriffe sind Grössenordnungen schneller als Speicherzugriffe.
NicknameFJ hat geschrieben:Das kann eigentlich nicht sein, dass der Compiler dies so optimiert. Und zwar aus folgender Überlegung heraus: Wenn die Laufvariable nur in einem Register geführt wird, hat man innerhalb der Schleife noch keinen Zugriff auf den jeweiligen Wert der PB-Variablen. Man könnte meinen dass dann der Compiler dies nur dann optimiert (=Laufvariable ausschließlich im Register hält) wenn innerhalb der Schleife nicht auf die Laufvar. zugegriffen wird. Angesicht der vielen Möglichkeiten scheint hier Prüfung ob eine Optimierung zulässig ist fast unmöglich.

Einige Varianten wo z.B. nicht optimiert werden dürfte:
Laufvariable ist eine globale Var., innerh. der Schleife wird eine andere Procedure aufgerufen, die Laufvar. könnte innerhalb der procedure auch shared sein , oder innerhalb der Schleife wird mit Gosub irgendwohin gesprungen, auch hier muss der Wert der (lokalen) Laufvar. bekannt sein; schließlich kann der Compiler nicht den Programmablauf nachvollziehen um zu sehen ob der Wert der Laufvariablen nicht während der Schleife benötigt wird.
Auch könnte es sein, dass ein Thread läuft in dem auf die ggfs. globale Laufvar. zugegriffen wird usw. Es scheint nahezu unmöglich alles zu prüfen ob nicht irgendwo der Wert der Laufvar. gebraucht wird
Man zerlegt den Code üblicherweise in Blöcke von Operationen. Im einfachsten Fall sind alle Sprungmarken sowie Anfang und Ende jeweils Grenzen eines Blockes. Innerhalb des Blockes findet keine Referenz von aussen statt. Schleifenvariablen sind üblicherweise lokal und daher von einem zweiten Thread aus gar nicht sichtbar. Nimmt man eine globale oder "shared" Variable als Schleifenvariable, dann erzeugt der Compiler anderen Code (nicht mehr in Registern haltbar, siehe "volatile" keyword in anderen Sprachen). Genauso verändern sich die Optimierungsstrategien erheblich wenn Float Werte für eine Schleife genutzt werden.

Ein viel grösseres Problem als volatile/shared Variablen, sind indirekte Zugriffe auf Variablen (per Pointer). In solchen Fällen kann der optimierte Code ungültig werden. Generell muss man deshalb bei agressiven Optimierungen aufpassen und bei der Source Entwicklung (in C etwa) schon im Hinterkopf haben welche der Optimierungsstrategien man später nutzen will bzw. sich verbaut.

Den Schleifenzähler in einem Register zu halten ist aber eine der einfachsten Optimierungen für Schleifen bei Compilern.

Übersicht zum Einstieg: http://de.wikipedia.org/wiki/Compiler#P ... Chrlich.29
Antworten