Variablen Deklaration Optimierung
-
hi
ich wollte fragen ob sich soetwas in der performance bemerkbar macht?eine simple variablen deklaration:
#include <iostream> int main(){ int x,y,z; }
oder
#include <iostream> int main(){ int x; int y; int z; }
ich habe einen bericht gelesen dort wurde kurz beschrieben das wenn man die variablen wie in beispiel 1 deklariert (int x,y,z;) dann würden sie im speicher direkt nebeneinander liegen... dies hätte performance vorteile...
nun meine frage, stimmt das?(wenn ja merkt man den unterschied?) und hat diese art-variablen zu deklarieren auch nachteile?
kann mir das jemand beantworten?
ich hab auch schonmal gegoogelt wusste aber nicht so richtig nach was ich treffend suche und dementsprechend nicht wirklich was gefunden...
ps. ein paar schlagworte zum recherchieren oder links würden mir auch schon viel weiterhelfen...dann wäre noch die frage mit den lokalen variablen...
macht es sinn lokal gültige variablen z.b. für eine for-schleife zunutzen, wenn ja welchen?wäre super wenn mir da wer helfen kann...
lg
-
WerWieWas schrieb:
hi
ich wollte fragen ob sich soetwas in der performance bemerkbar macht?eine simple variablen deklaration:
#include <iostream> int main(){ int x,y,z; }
oder
#include <iostream> int main(){ int x; int y; int z; }
ich habe einen bericht gelesen dort wurde kurz beschrieben das wenn man die variablen wie in beispiel 1 deklariert (int x,y,z;) dann würden sie im speicher direkt nebeneinander liegen... dies hätte performance vorteile...
nun meine frage, stimmt das?(wenn ja merkt man den unterschied?) und hat diese art-variablen zu deklarieren auch nachteile?
kann mir das jemand beantworten?
ich hab auch schonmal gegoogelt wusste aber nicht so richtig nach was ich treffend suche und dementsprechend nicht wirklich was gefunden...
ps. ein paar schlagworte zum recherchieren oder links würden mir auch schon viel weiterhelfen...alles wurscht
WerWieWas schrieb:
dann wäre noch die frage mit den lokalen variablen...
macht es sinn lokal gültige variablen z.b. für eine for-schleife zunutzen, wenn ja welchen?macht nur n unterschied, wenn die initialisierung irgendwelche seiteneffekte hat, z.b. n cout
dann MUSS der compiler sie mehrmals durchfuehren
im zweifelsfall nachmessen und ggf. eine variable aus der schleife ziehen
-
Kellerautomat schrieb:
WerWieWas schrieb:
hi
ich wollte fragen ob sich soetwas in der performance bemerkbar macht?eine simple variablen deklaration:
#include <iostream> int main(){ int x,y,z; }
oder
#include <iostream> int main(){ int x; int y; int z; }
ich habe einen bericht gelesen dort wurde kurz beschrieben das wenn man die variablen wie in beispiel 1 deklariert (int x,y,z;) dann würden sie im speicher direkt nebeneinander liegen... dies hätte performance vorteile...
nun meine frage, stimmt das?(wenn ja merkt man den unterschied?) und hat diese art-variablen zu deklarieren auch nachteile?
kann mir das jemand beantworten?
ich hab auch schonmal gegoogelt wusste aber nicht so richtig nach was ich treffend suche und dementsprechend nicht wirklich was gefunden...
ps. ein paar schlagworte zum recherchieren oder links würden mir auch schon viel weiterhelfen...alles wurscht
WerWieWas schrieb:
dann wäre noch die frage mit den lokalen variablen...
macht es sinn lokal gültige variablen z.b. für eine for-schleife zunutzen, wenn ja welchen?macht nur n unterschied, wenn die initialisierung irgendwelche seiteneffekte hat, z.b. n cout
dann MUSS der compiler sie mehrmals durchfuehren
im zweifelsfall nachmessen und ggf. eine variable aus der schleife ziehenok vielen dank für die schnelle antwort...
wenn ich fragen darf wie kommst du darauf das das "wurscht" ist?
kannst mir das erklären? liegen die nicht im speicherbereich nebeneinander? sind dann nicht auch die zugriffszeiten geringer wenn die variablen nacheiander genutzt werden?
oder merkt man soetwas eh nich? oder wird das vom compilier optimiert...?
(oder hast vielleicht ne quelle wo ich sowas lesen kann?)ja aber ich meinte eher macht es einen vorteil wenn ich die variable nur 1 mal lokal in einer schleife nutze?
diese dann dort zu deklarieren wenn ja welchen?
weil ob sie bis programmende gültig ist oder bis ende der schleife ist ja kein großer unterschied oder doch?
wo wäre z.B. soetwas von bedeutung?`
-
Variablen sollte man so lokal wie moeglich halten. Seiteneffekte oder komplizierte, mehrfache Berechnungen sollte man sich aber sparen.
-
WerWieWas schrieb:
ok vielen dank für die schnelle antwort...
wenn ich fragen darf wie kommst du darauf das das "wurscht" ist?
kannst mir das erklären? liegen die nicht im speicherbereich nebeneinander? sind dann nicht auch die zugriffszeiten geringer wenn die variablen nacheiander genutzt werden?
oder merkt man soetwas eh nich? oder wird das vom compilier optimiert...?
(oder hast vielleicht ne quelle wo ich sowas lesen kann?)das ist nur ne andere art dasselbe hinzuschreiben. der compiler hat ne liste an variablen, wie das dasteht ist dem vollkommen egal. er behandelt es 1:1 identisch. und nur weil du eine variable hinschreibst, heisst das noch lange nicht, dass es im fertigen programm diese ueberhaupt gibt. der compiler kann auch einfach alle variablen wegschmeissen, wenns ihm passt.
WerWieWas schrieb:
ja aber ich meinte eher macht es einen vorteil wenn ich die variable nur 1 mal lokal in einer schleife nutze?
diese dann dort zu deklarieren wenn ja welchen?achso, na dann siehe vorposter
WerWieWas schrieb:
weil ob sie bis programmende gültig ist oder bis ende der schleife ist ja kein großer unterschied oder doch?
wo wäre z.B. soetwas von bedeutung?`bei kleinen programmen mit 5 variablen isses egal, bei groesseren mit abertausenden von variablen nicht.
-
Marthog schrieb:
Variablen sollte man so lokal wie moeglich halten. Seiteneffekte oder komplizierte, mehrfache Berechnungen sollte man sich aber sparen.
ok, mit dem lokal wie möglich ist mir logisch.
aber sollte man seiteneffekte sparen? ist doch eigentlich schneller wenns klappt?
kompilizierte, mehrfach berechnungen will ich nicht bzw. mache ich nicht...
es ging mir nur darum ob es vor- und nachteile gibt von z.B. seiteneffekten oder speziellen variablen deklarationen, wenn ja oder nein welche und warum?
-
WerWieWas schrieb:
ja aber ich meinte eher macht es einen vorteil wenn ich die variable nur 1 mal lokal in einer schleife nutze?
diese dann dort zu deklarieren wenn ja welchen?lokalere variablen können von dümmeren opzimiertern besser in register gestopft werden, statt auf dem stack wohnen zu müssen.
mach alles so lokal wie möglich außer den ziemlich seltenen ausnahmen wie dem zeilenlesstring.
-
Kellerautomat schrieb:
WerWieWas schrieb:
ok vielen dank für die schnelle antwort...
wenn ich fragen darf wie kommst du darauf das das "wurscht" ist?
kannst mir das erklären? liegen die nicht im speicherbereich nebeneinander? sind dann nicht auch die zugriffszeiten geringer wenn die variablen nacheiander genutzt werden?
oder merkt man soetwas eh nich? oder wird das vom compilier optimiert...?
(oder hast vielleicht ne quelle wo ich sowas lesen kann?)das ist nur ne andere art dasselbe hinzuschreiben. der compiler hat ne liste an variablen, wie das dasteht ist dem vollkommen egal. er behandelt es 1:1 identisch. und nur weil du eine variable hinschreibst, heisst das noch lange nicht, dass es im fertigen programm diese ueberhaupt gibt. der compiler kann auch einfach alle variablen wegschmeissen, wenns ihm passt.
WerWieWas schrieb:
ja aber ich meinte eher macht es einen vorteil wenn ich die variable nur 1 mal lokal in einer schleife nutze?
diese dann dort zu deklarieren wenn ja welchen?achso, na dann siehe vorposter
WerWieWas schrieb:
weil ob sie bis programmende gültig ist oder bis ende der schleife ist ja kein großer unterschied oder doch?
wo wäre z.B. soetwas von bedeutung?`bei kleinen programmen mit 5 variablen isses egal, bei groesseren mit abertausenden von variablen nicht.
ja aber wann macht das der compiler und wann nicht?
soweit war ich auch schon... das meinte ichja mit optimiert vom compiler...
aber weißt du das der compiler alle variablen wegschmeisst oder zusammenfasst oder sonst was? wenn ja quelle?
kann man da eine regel definieren welche variablen vom compiler optimiert werden?bedenke bitte auch das das "neu deklarieren" einer variablen auch rechenleistung benötigt und es auch bei abertausenden nicht unbedingt sinnvoll ist lokal gültige zu nutzen... aber was konkret ist der unterschied ob ich eine im speicher halte oder ob sie die gültigkeit verliert? -> sind das merkliche performance unterschiede? -> vll beispiel oder ne quelle?
volkard schrieb:
WerWieWas schrieb:
ja aber ich meinte eher macht es einen vorteil wenn ich die variable nur 1 mal lokal in einer schleife nutze?
diese dann dort zu deklarieren wenn ja welchen?lokalere variablen können von dümmeren opzimiertern besser in register gestopft werden, statt auf dem stack wohnen zu müssen.
mach alles so lokal wie möglich außer den ziemlich seltenen ausnahmen wie dem zeilenlesstring.ok, aber warum genau z.b. in diesem fall ?
kannst mir das schnell kurz erklären oder mir nen link, quelle oder nen schlagwort geben wo ich soetwas nachlesen kann? bitte
-
WerWieWas schrieb:
ja aber wann macht das der compiler und wann nicht?
soweit war ich auch schon... das meinte ichja mit optimiert vom compiler...
aber weißt du das der compiler alle variablen wegschmeisst oder zusammenfasst oder sonst was? wenn ja quelle?
kann man da eine regel definieren welche variablen vom compiler optimiert werden?frag ihn doch!
WerWieWas schrieb:
bedenke bitte auch das das "neu deklarieren" einer variablen auch rechenleistung benötigt und es auch bei abertausenden nicht unbedingt sinnvoll ist lokal gültige zu nutzen... aber was konkret ist der unterschied ob ich eine im speicher halte oder ob sie die gültigkeit verliert? -> sind das merkliche performance unterschiede? -> vll beispiel oder ne quelle?
noe, "neu deklarieren" (du meinst definieren) kostet erstmal garnix. der compiler alloziert nen stack frame mit genug platz fuer alle variablen, das ist nur ein 'sub rsp, <bytes>'. initialisierungen kosten. vielleicht.
-
WerWieWas schrieb:
volkard schrieb:
mach alles so lokal wie möglich außer den ziemlich seltenen ausnahmen wie dem zeilenlesstring.
ok, aber warum genau z.b. in diesem fall ?
kannst mir das schnell kurz erklären oder mir nen link, quelle oder nen schlagwort geben wo ich soetwas nachlesen kann? bitteich bin sichi, du kommst von alleine drauf, sobald du es wissen darfst.
-
Kellerautomat schrieb:
WerWieWas schrieb:
ja aber wann macht das der compiler und wann nicht?
soweit war ich auch schon... das meinte ichja mit optimiert vom compiler...
aber weißt du das der compiler alle variablen wegschmeisst oder zusammenfasst oder sonst was? wenn ja quelle?
kann man da eine regel definieren welche variablen vom compiler optimiert werden?frag ihn doch!
danke für deine geistreichen und vorallem nachvollziehbar belegbare hilfen!
darauf bin ich bis jetzt noch gar nicht gekommen ihn einfac zu fragenKellerautomat schrieb:
WerWieWas schrieb:
bedenke bitte auch das das "neu deklarieren" einer variablen auch rechenleistung benötigt und es auch bei abertausenden nicht unbedingt sinnvoll ist lokal gültige zu nutzen... aber was konkret ist der unterschied ob ich eine im speicher halte oder ob sie die gültigkeit verliert? -> sind das merkliche performance unterschiede? -> vll beispiel oder ne quelle?
noe, "neu deklarieren" (du meinst definieren) kostet erstmal garnix. der compiler alloziert nen stack frame mit genug platz fuer alle variablen, das ist nur ein 'sub rsp, <bytes>'. initialisierungen kosten. vielleicht.
nope ich meine deklarieren...
Deklaration: Mit der Deklaration einer Variablen wird der Typ der Variablen (z.B. der Datentyp int für ganze Zahlen) festgelegt und der namentliche Bezeichner für diese Variable. Eine korrekte Deklaration ist vor allem für den Compiler von Bedeutung, denn dieser muss wissen, wie der im Speicher abgelegte Wert zu interpretieren ist.
Definition: Mit der Definition wird der erforderliche Speicherplatz für eine Variable reserviert. Eine korrekte Definition ist vor allem für den Linker von Bedeutung.
Initialisierung: Mit der Initialisierung wird der Variablen ein Anfangswert zugewiesen, der sich während des Programmablaufs ändern kann, jedoch nicht zwangsläufig ändern muss.
Zuweisung: Bei der Initialisierung erfolgt die Zuweisung des rechts stehenden Operanden (Anfangswert) zum links stehen Operanden (Bezeichner der Variablen) durch einen Zuweisungsoperator (=). Statt einer Initialisierung durch einen einzelnen Anfangswert, kann einer Variablen ein berechneter Wert von anderen Speicheradressen zugewiesen werden.deklarationen brauchen speicher und rechenleistung
aber das beantwortet ja nicht meine frage...
bitte auf meine fragestellung beziehen... :wo ist der unterschied und hat es vor- und nachteile? (und warum?)
-
volkard schrieb:
WerWieWas schrieb:
volkard schrieb:
mach alles so lokal wie möglich außer den ziemlich seltenen ausnahmen wie dem zeilenlesstring.
ok, aber warum genau z.b. in diesem fall ?
kannst mir das schnell kurz erklären oder mir nen link, quelle oder nen schlagwort geben wo ich soetwas nachlesen kann? bitteich bin sichi, du kommst von alleine drauf, sobald du es wissen darfst.
sobald ich es wissen darf? was soll das bedeuten?
kann mir deine aussage zur lösung des problems helfen?! -> nein, bitte kein post hunting hier.. oder sinnlos beiträge... hilft mir nicht weiter...ist ja mal eine interessante frage warum ich das nicht wissen sollen dürfte?
-
WerWieWas schrieb:
nope ich meine deklarieren...
Deklaration: Mit der Deklaration einer Variablen wird der Typ der Variablen (z.B. der Datentyp int für ganze Zahlen) festgelegt und der namentliche Bezeichner für diese Variable. Eine korrekte Deklaration ist vor allem für den Compiler von Bedeutung, denn dieser muss wissen, wie der im Speicher abgelegte Wert zu interpretieren ist.
...
deklarationen brauchen speicher und rechenleistungLiest du deine kopierten Texte auch selber?
-
WerWieWas schrieb:
deklarationen brauchen speicher und rechenleistung
Nö, eigentlich nicht.
WerWieWas schrieb:
ist ja mal eine interessante frage warum ich das nicht wissen sollen dürfte?
Weil diese Art der Optimierung böse danach klingt, als würdest Du Dir den Stil versauen wollen. Dem mag ich heute keinen Vorschub leisten. Mach erstmal einfach alles so lokal wie möglich.
http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=Declare#AnswWerWieWas schrieb:
Damit wirste nicht mehr sehr viele hilfreiche Antworten bekommen. Von mir jedenfalls nicht mehr, lies ein Buch!
-
WerWieWas schrieb:
danke für deine geistreichen und vorallem nachvollziehbar belegbare hilfen!
darauf bin ich bis jetzt noch gar nicht gekommen ihn einfac zu fragenschau dir den assembly-output an. das ist der einzige weg zu wissen, was passiert ist.
-
manni66 schrieb:
WerWieWas schrieb:
nope ich meine deklarieren...
Deklaration: Mit der Deklaration einer Variablen wird der Typ der Variablen (z.B. der Datentyp int für ganze Zahlen) festgelegt und der namentliche Bezeichner für diese Variable. Eine korrekte Deklaration ist vor allem für den Compiler von Bedeutung, denn dieser muss wissen, wie der im Speicher abgelegte Wert zu interpretieren ist.
...
deklarationen brauchen speicher und rechenleistungLiest du deine kopierten Texte auch selber?
jop... nur dort steht es ist wichtig für den compiler damit er weiß wo sie im speicher abgelegt sind...
so nun ist die frage kann man sie gezielt so ablegen das es schneller wird?volkard schrieb:
WerWieWas schrieb:
deklarationen brauchen speicher und rechenleistung
Nö, eigentlich nicht.
WerWieWas schrieb:
ist ja mal eine interessante frage warum ich das nicht wissen sollen dürfte?
Weil diese Art der Optimierung böse danach klingt, als würdest Du Dir den Stil versauen wollen. Dem mag ich heute keinen Vorschub leisten. Mach erstmal einfach alles so lokal wie möglich.
http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=Declare#AnswWerWieWas schrieb:
Damit wirste nicht mehr sehr viele hilfreiche Antworten bekommen. Von mir jedenfalls nicht mehr, lies ein Buch!
wieso wird kein speicher belegt wenn ich eine variable in den speicher lege? (rechenleistung für den vorgang des speicherns? wie funktioniert das sonst?)
na ja es ist ja so lokal wie möglich... mir geht es ja eher darum es noch "lokaler" zu machen um deklarationen eben zu sparen ( wie in deinem link beschrieben nur mit variablen und nicht objekten, alternativ ähnliches vorgehen oder möglichkeiten )
ja sry für aber solche unproduktiven bzw. sinnlosen sätze wie von dir oben lassen mich einfach meinen spaß an der einen oder anderen community verlieren ... deswegen in meinen augen ein absolutes nogo ein post ohne wirkliche aussage abzusenden und threads von leuten die wirklich eine frage haben und hilfe brauchen zu zuspamen... aber muss jeder für sich selbst wissen...
-
Kellerautomat schrieb:
WerWieWas schrieb:
danke für deine geistreichen und vorallem nachvollziehbar belegbare hilfen!
darauf bin ich bis jetzt noch gar nicht gekommen ihn einfac zu fragenschau dir den assembly-output an. das ist der einzige weg zu wissen, was passiert ist.
joa ...
ich weiß was passiert ... nur ich will wissen was kann man noch verbessern...
assembly hab ich mir schon angeschaut...
also wie kann ich die variablen gezielt in den speicherlegen um ihre zugriffszeiten zu verkürzen bzw. zu verbessern?
oder ist soetwas generell nicht möglich oder sieht man aus programm design gründen von soetwas ab? (warum wieso? quelle?) :p
-
man kann keine variablen in den speicher legen. dein computer kennt nur ein grosses array aus bytes.
variablen sind nur namen fuer diese zellen. die muessen nicht erst erzeugt werden, weil es sie schon immer gab und geben wird.
-
WerWieWas schrieb:
deklarationen brauchen speicher und rechenleistung
NEIN. Deklarationen brauchen keine Rechenleistung.
Der Speicher ist ja im Rechner eingebaut. Mit der Deklaration sage ich erst mal nur dem Compiler, dass er vorsehen soll, einen bestimmten Speicherbereich einen Namen zu geben, um ihn ansprechen zu könne. Zur Laufzeit passiert bei der Deklaration erst mal gar nichts.
Wenn ich 3 lokale Variablen mit jeweils 8 Bytes habe, dann muss der Compiler code generieren, um den Stackpointer um 24 Bytes zu verschieben (vereinfacht dargestellt). Ob ich das in einer Deklaration mache oder in mehreren ist absolut unerheblich. Da wird noch nicht mal der Optimierer bemüht.
-
Kellerautomat schrieb:
man kann keine variablen in den speicher legen. dein computer kennt nur ein grosses array aus bytes.
variablen sind nur namen fuer diese zellen. die muessen nicht erst erzeugt werden, weil es sie schon immer gab und geben wird.- jop schon klar, mir sind auch stack und heap bekannt und alles andere..
- vielleicht ist das meiner seits nicht ganz korrekt formuliert...
- ich habe aber auch geschrieben "belegt" und der inhalt deiner im code erzeugen variablen "belegt" schon speicher im stack...
- wenn ich will kann ich soagr ganz gezielte bereich im stack beschreiben...
- im heap übrigens auch... -> dazu musst nur deine exe disassemblieren und schon hast alles was du brauchst... )- mein problem ist nur folgendes: ich weiß nicht wie ich das nun anordne das es schneller werden kann... bzw sollte...
- ich weiß auch nicht wo ich soetwas nach lese...
- aber soweit ich schon rausgefunden habe ist das von der compiler optimierung abhänig... also sollte ich dort mal nachlesen...- ich meine in etwa sowas hier :
http://www.mikrocontroller.net/articles/AVR-GCC-Codeoptimierungdort geht es aber im mikrokontroller(das wäre ja nochnicht mal das problem) und optimierungen an anderen stellen als die die ich vornehmen möchte...
(mir geht es nur um die deklaration der variablen...)
-
tntnet schrieb:
WerWieWas schrieb:
deklarationen brauchen speicher und rechenleistung
NEIN. Deklarationen brauchen keine Rechenleistung.
Der Speicher ist ja im Rechner eingebaut. Mit der Deklaration sage ich erst mal nur dem Compiler, dass er vorsehen soll, einen bestimmten Speicherbereich einen Namen zu geben, um ihn ansprechen zu könne. Zur Laufzeit passiert bei der Deklaration erst mal gar nichts.
Wenn ich 3 lokale Variablen mit jeweils 8 Bytes habe, dann muss der Compiler code generieren, um den Stackpointer um 24 Bytes zu verschieben (vereinfacht dargestellt). Ob ich das in einer Deklaration mache oder in mehreren ist absolut unerheblich. Da wird noch nicht mal der Optimierer bemüht.
aber sie belegen speicher, und dieses speicher belegen kostet rechenleistung...
da dein programm ja (vereinfacht) zum compiler sagt "SPEICHER DAS MAL ..."
dann arbeitet = leistung der prozessor... wie sollte so etwas sonst funktionieren?nat. ist meine aussage etwas ungenau... wiel bei dder deklaration selbst wird keine rechnenleistung verbraucht... (obwohl ich mir da auch nicht 100% sicher bin da dein programm ja trozdem einen "platzhalter mit namentlicher bezeichnung" mit speicherbereich erzeugt und das muss ja vom prozessor alles abgearbeitet werden oder nicht?
ja, das war auch nicht meine frage... meine frage ist eher macht es sinn die variablen die ich nutze so nah wie möglich "zusammen" auf den stack zulegen so das der stackpointer weniger "springen" oder "verschoben" werden muss?
würde eine deratige optimierung sinn machen? wenn ja merkt man diesen bei "vielen" variablen (ca 100 versch.) ?