<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[get&amp;amp;set-Optimierung]]></title><description><![CDATA[<p>Im Mittelpunkt steht die Berechnung und Ausgabe der Fläche. Die Methode zur Berechnung der Fläche sei als rechenintensiv verstanden. Die Attribute &quot;schnell&quot; und &quot;langsam&quot; bzw. &quot;input-optimiert&quot; und &quot;output-optimiert&quot; beziehen sich auf die Ein- und Ausgabe-Methoden. Die Objekt-Variablen sind zur Wahrung des Konzepts &quot;Data-Encapselation&quot; allesamt &quot;private&quot;. Einder der resultierenden Vorteile ist, daß jede der nachfolgenden drei Implementierungen von Rechteck gegeneinander getauscht werden kann, ohne daß weiterer Code angepasst werden muß.</p>
<p>Implementierung 1. --- Input-optimiert</p>
<p>Die Schreibzugriffe werden unmittelbar ausgeführt und die Ausgabe der Fläche wird bei jedem (Lese-)Zugriff neu berechnet.</p>
<pre><code>class Rechteck {
  private:
    int m_laenge;
    int m_breite;

  public:
    Rechteck (int laenge, int breite) : m_laenge(laenge), m_breite(breite) {}

  public:
    const int  getLaenge  ()           {return this-&gt;m_laenge        ;}
          void setLaenge  (int laenge) {       this-&gt;m_laenge=laenge ;}
    const int  getBreite  ()           {return this-&gt;m_breite        ;}
          void setBreite  (int breite) {       this-&gt;m_breite=breite ;}

    /** int getFlaeche(void) ist hier für zum Vorteil von 
     *  void setLaenge(int laenge) und void setBreite(int breite)
     *  &quot;langsam&quot; implementiert, da jeder Aufruf von getFlaeche in die 
     *  Berechnung  der Flaeche muendet.
     */
    int  getFlaeche ()           {return (this-&gt;m_laenge*this-&gt;m_breite) ;}
};
</code></pre>
<p>Implementierung 2. --- Output-optimiert</p>
<p>Die Ausgabe der Fläche erfolgt schnell, weil sie bereits berechnet vorliegt und wenn sich die dafür zugrundeliegenden Parameter m_laenge oder m_breite ändern, wird die Fläche sofort neu berechent und gespeichert.</p>
<pre><code>class Rechteck {
  private:
    int m_laenge;
    int m_breite;
    int m_flaeche; /* NEU */
  public:
    Rechteck (int laenge, int breite) : m_laenge(laenge), m_breite(breite)     {this-&gt;consolidate() ;}

  public:
    /** NEU  Wenn m_laenge oder m_breite über die entsprechenden set-Methoden
     *  geändert, wird jedesmal die Fläche neu berechnet. Die Methode hierfür
     *  nenne ich consolidate(), weil sie den inneren Zustand konsolidiert.
     */
          void consolidate ()           {this-&gt;m_flaeche=(this-&gt;m_laenge*this-&gt;m_breite) ;}
    const int  getLaenge   ()           {return this-&gt;m_laenge        ;}
          void setLaenge   (int laenge) {       this-&gt;m_laenge=laenge; consolidate() ;}
    const int  getBreite   ()           {return this-&gt;m_breite        ;}
          void setBreite   (int breite) {       this-&gt;m_breite=breite; consolidate() ;}
    const int  getFlaeche  ()           {return this-&gt;m_flaeche       ;}
};
</code></pre>
<p>Implementierung 3. --- Input/Output-optimiert</p>
<p>Hier wird die Fläche nur berechnet, wenn sich m_laenge oder m_breite geändert haben. Dafür sind die Schreibzugriffe wegen des Aufrufes von setInvalid() nur etwas langsamer als in Implementation 1, der Lesezugriff auf m_flaeche im Idealfall nur etwas langsamer als in Implementation 2 wegen der Prüfung auf Gültigkeit (m_validity) und die Fläche wird nur neu berechnet, wenn sich die zugrundeliegenden Parameter (m_laenge und m_breite) geändert haben UND die Fläche auch tatsächlich gebraucht wird.</p>
<pre><code>class Rechteck {
  private:
            int  m_laenge;
            int  m_breite;
    mutable int  m_flaeche;
    mutable bool m_validity; /* NEU */

  public:
    Rechteck (int laenge, int breite) : m_laenge(laenge), m_breite(breite) {}

  public:
          void consolidate ()           {this-&gt;m_flaeche=(this-&gt;m_laenge*this-&gt;m_breite); this-&gt;setValid() ;}
    const int  getLaenge   ()           {return this-&gt;m_laenge        ;}
          void setLaenge   (int laenge) {       this-&gt;m_laenge=laenge; this-&gt;setInvalid() ;}
    const int  getBreite   ()           {return this-&gt;m_breite        ;}
          void setBreite   (int breite) {       this-&gt;m_breite=breite; this-&gt;setInvalid() ;}
          bool isInvalid   ()           {return (!this-&gt;m_validity)     ;}
    const int  getFlaeche  ()           {if (this-&gt;isInvalid()) consolidate(); return this-&gt;m_flaeche ;}
  private:
          void setValid    ()           {this-&gt;m_validity=true          ;}
          void setInvalid  ()           {this-&gt;m_validity=false         ;}
};
</code></pre>
<p>Ich hoffe da sind jetzt keine mehr Bugs drin <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/176032/get-amp-set-optimierung</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 01:47:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/176032.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 16 Mar 2007 16:06:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to get&amp;amp;set-Optimierung on Sat, 17 Mar 2007 12:04:39 GMT]]></title><description><![CDATA[<p>Im Mittelpunkt steht die Berechnung und Ausgabe der Fläche. Die Methode zur Berechnung der Fläche sei als rechenintensiv verstanden. Die Attribute &quot;schnell&quot; und &quot;langsam&quot; bzw. &quot;input-optimiert&quot; und &quot;output-optimiert&quot; beziehen sich auf die Ein- und Ausgabe-Methoden. Die Objekt-Variablen sind zur Wahrung des Konzepts &quot;Data-Encapselation&quot; allesamt &quot;private&quot;. Einder der resultierenden Vorteile ist, daß jede der nachfolgenden drei Implementierungen von Rechteck gegeneinander getauscht werden kann, ohne daß weiterer Code angepasst werden muß.</p>
<p>Implementierung 1. --- Input-optimiert</p>
<p>Die Schreibzugriffe werden unmittelbar ausgeführt und die Ausgabe der Fläche wird bei jedem (Lese-)Zugriff neu berechnet.</p>
<pre><code>class Rechteck {
  private:
    int m_laenge;
    int m_breite;

  public:
    Rechteck (int laenge, int breite) : m_laenge(laenge), m_breite(breite) {}

  public:
    const int  getLaenge  ()           {return this-&gt;m_laenge        ;}
          void setLaenge  (int laenge) {       this-&gt;m_laenge=laenge ;}
    const int  getBreite  ()           {return this-&gt;m_breite        ;}
          void setBreite  (int breite) {       this-&gt;m_breite=breite ;}

    /** int getFlaeche(void) ist hier für zum Vorteil von 
     *  void setLaenge(int laenge) und void setBreite(int breite)
     *  &quot;langsam&quot; implementiert, da jeder Aufruf von getFlaeche in die 
     *  Berechnung  der Flaeche muendet.
     */
    int  getFlaeche ()           {return (this-&gt;m_laenge*this-&gt;m_breite) ;}
};
</code></pre>
<p>Implementierung 2. --- Output-optimiert</p>
<p>Die Ausgabe der Fläche erfolgt schnell, weil sie bereits berechnet vorliegt und wenn sich die dafür zugrundeliegenden Parameter m_laenge oder m_breite ändern, wird die Fläche sofort neu berechent und gespeichert.</p>
<pre><code>class Rechteck {
  private:
    int m_laenge;
    int m_breite;
    int m_flaeche; /* NEU */
  public:
    Rechteck (int laenge, int breite) : m_laenge(laenge), m_breite(breite)     {this-&gt;consolidate() ;}

  public:
    /** NEU  Wenn m_laenge oder m_breite über die entsprechenden set-Methoden
     *  geändert, wird jedesmal die Fläche neu berechnet. Die Methode hierfür
     *  nenne ich consolidate(), weil sie den inneren Zustand konsolidiert.
     */
          void consolidate ()           {this-&gt;m_flaeche=(this-&gt;m_laenge*this-&gt;m_breite) ;}
    const int  getLaenge   ()           {return this-&gt;m_laenge        ;}
          void setLaenge   (int laenge) {       this-&gt;m_laenge=laenge; consolidate() ;}
    const int  getBreite   ()           {return this-&gt;m_breite        ;}
          void setBreite   (int breite) {       this-&gt;m_breite=breite; consolidate() ;}
    const int  getFlaeche  ()           {return this-&gt;m_flaeche       ;}
};
</code></pre>
<p>Implementierung 3. --- Input/Output-optimiert</p>
<p>Hier wird die Fläche nur berechnet, wenn sich m_laenge oder m_breite geändert haben. Dafür sind die Schreibzugriffe wegen des Aufrufes von setInvalid() nur etwas langsamer als in Implementation 1, der Lesezugriff auf m_flaeche im Idealfall nur etwas langsamer als in Implementation 2 wegen der Prüfung auf Gültigkeit (m_validity) und die Fläche wird nur neu berechnet, wenn sich die zugrundeliegenden Parameter (m_laenge und m_breite) geändert haben UND die Fläche auch tatsächlich gebraucht wird.</p>
<pre><code>class Rechteck {
  private:
            int  m_laenge;
            int  m_breite;
    mutable int  m_flaeche;
    mutable bool m_validity; /* NEU */

  public:
    Rechteck (int laenge, int breite) : m_laenge(laenge), m_breite(breite) {}

  public:
          void consolidate ()           {this-&gt;m_flaeche=(this-&gt;m_laenge*this-&gt;m_breite); this-&gt;setValid() ;}
    const int  getLaenge   ()           {return this-&gt;m_laenge        ;}
          void setLaenge   (int laenge) {       this-&gt;m_laenge=laenge; this-&gt;setInvalid() ;}
    const int  getBreite   ()           {return this-&gt;m_breite        ;}
          void setBreite   (int breite) {       this-&gt;m_breite=breite; this-&gt;setInvalid() ;}
          bool isInvalid   ()           {return (!this-&gt;m_validity)     ;}
    const int  getFlaeche  ()           {if (this-&gt;isInvalid()) consolidate(); return this-&gt;m_flaeche ;}
  private:
          void setValid    ()           {this-&gt;m_validity=true          ;}
          void setInvalid  ()           {this-&gt;m_validity=false         ;}
};
</code></pre>
<p>Ich hoffe da sind jetzt keine mehr Bugs drin <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1246810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1246810</guid><dc:creator><![CDATA[gorgoyle]]></dc:creator><pubDate>Sat, 17 Mar 2007 12:04:39 GMT</pubDate></item><item><title><![CDATA[Reply to get&amp;amp;set-Optimierung on Sat, 17 Mar 2007 01:52:16 GMT]]></title><description><![CDATA[<p>Wie wär's damit die getter const zu machen, und m_validity und m_flaeche dafür halt mutable.<br />
Und &quot;void foo(void)&quot; ist ganz grausig &quot;C-ig&quot;, und noch schlimmer ist es &quot;void foo(void)&quot; mit &quot;void bar()&quot; zu mischen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1247058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247058</guid><dc:creator><![CDATA[hustbaer_]]></dc:creator><pubDate>Sat, 17 Mar 2007 01:52:16 GMT</pubDate></item><item><title><![CDATA[Reply to get&amp;amp;set-Optimierung on Sat, 17 Mar 2007 07:46:01 GMT]]></title><description><![CDATA[<p>außerdem denkt bei IO-optimierten zugriffen jeder an high-performace dateioperationen. was du beschreibst, ist eher caching von berechnungsergebnissen.<br />
<a href="http://www.possibility.com/Cpp/const.html" rel="nofollow">http://www.possibility.com/Cpp/const.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1247094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247094</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 17 Mar 2007 07:46:01 GMT</pubDate></item><item><title><![CDATA[Reply to get&amp;amp;set-Optimierung on Sat, 17 Mar 2007 08:21:57 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>außerdem denkt bei IO-optimierten zugriffen jeder an high-performace dateioperationen.</p>
</blockquote>
<p>das stimmt nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1247099</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247099</guid><dc:creator><![CDATA[vista]]></dc:creator><pubDate>Sat, 17 Mar 2007 08:21:57 GMT</pubDate></item><item><title><![CDATA[Reply to get&amp;amp;set-Optimierung on Sat, 17 Mar 2007 10:51:56 GMT]]></title><description><![CDATA[<p>IO habe ich auch an eine Filestream-Frage gedacht... ist halt so. IO bei getter und setter? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> Es gibt nunmal ungeschriebene Gesetze! Und eine lauetet: IO hat was mit Hardware-Ein- und -Ausgabe zu tun (Dateien, USB, Bildschirm usw.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1247101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247101</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Sat, 17 Mar 2007 10:51:56 GMT</pubDate></item><item><title><![CDATA[Reply to get&amp;amp;set-Optimierung on Sat, 17 Mar 2007 12:20:55 GMT]]></title><description><![CDATA[<p>IO hört sich schicker an <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> Na gut ... dann nenn ich diesen Thread get&amp;set-Optimierung.</p>
<p>Danke für diese Vorschläge</p>
<p>@Volkert Nein, es geht hier nicht um das zwischenspeichern von Ergebnissen, sondern um die Optimierung von get&amp;set-Methoden. Wenn es sich bei dem Rechteck um eines handelt, bei dem sich häufig Seitenlängen ändert ist Implementierung 1. angesagt. Wenn die Seitenlängen sich selten ändern aber häufig die Fläche benötigt wird, dann ist Implementierung 2. die bessere Lösung. Wenn aber die Zugriffe häufig zwischen Lesen und Schreiben wechseln, ist die 3. Implementation die günstigste Lösung. Daß hierfür Ergebnisse zwischengespeichert werden müssen, ist ebend unumgänglich. Diesen Punkt heranzuziehen um das ganze &quot;Caching&quot; zu nennen, gefällt mir nicht. Ich selber nenne es für mich auf denglisch Data-Flow-Optimation - also Datenfluß-Optimierung. Findet jemand diesen Begriff anstößig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1247157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247157</guid><dc:creator><![CDATA[gorgoyle]]></dc:creator><pubDate>Sat, 17 Mar 2007 12:20:55 GMT</pubDate></item><item><title><![CDATA[Reply to get&amp;amp;set-Optimierung on Sat, 17 Mar 2007 19:30:12 GMT]]></title><description><![CDATA[<p>gorgoyle schrieb:</p>
<blockquote>
<p>Nein, es geht hier nicht um das zwischenspeichern von Ergebnissen, sondern um die Optimierung von get&amp;set-Methoden. Wenn es sich bei dem Rechteck um eines handelt, bei dem sich häufig Seitenlängen ändert ist Implementierung 1. angesagt. Wenn die Seitenlängen sich selten ändern aber häufig die Fläche benötigt wird, dann ist Implementierung 2. die bessere Lösung. Wenn aber die Zugriffe häufig zwischen Lesen und Schreiben wechseln, ist die 3. Implementation die günstigste Lösung. Daß hierfür Ergebnisse zwischengespeichert werden müssen, ist ebend unumgänglich.</p>
</blockquote>
<p>es geht ums caching. und du erklärst fein, daß caching von berechnungsergebnissen oder sonstwelchen aufwendigen operationen. und du zeigst auch, daß sowas mit kosten verbunden ist, weshalb man vorher fein überlegen sollte, ob sich das auch lohnt. schreibt man sehr viel und liest sehr selten, sollte man das schreiben so performant wie möglich machen und das lesen kann ruhig ohne caching sein. liest man sehr viel und schreibt sehr selten, sollte man das berechnungsergebnis vorhalten und bei jedem schreiben neuberechnen. liegt man irgendwo dazwischen, kann es sich anbieten, das ergebnis erst auf anfrage zu berechnen und bis zum nächsten schreiben zu cachen.</p>
<blockquote>
<p>Diesen Punkt heranzuziehen um das ganze &quot;Caching&quot; zu nennen, gefällt mir nicht.</p>
</blockquote>
<p>komisch.</p>
<blockquote>
<p>Ich selber nenne es für mich auf denglisch Data-Flow-Optimation - also Datenfluß-Optimierung. Findet jemand diesen Begriff anstößig?</p>
</blockquote>
<p>das klingt irgendwie nach detenflußoptimierung statt nach caching.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1247447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247447</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 17 Mar 2007 19:30:12 GMT</pubDate></item><item><title><![CDATA[Reply to get&amp;amp;set-Optimierung on Sun, 18 Mar 2007 01:42:33 GMT]]></title><description><![CDATA[<p>gorgoyle schrieb:</p>
<blockquote>
<p>IO hört sich schicker an <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> Na gut ... dann nenn ich diesen Thread get&amp;set-Optimierung.</p>
<p>Danke für diese Vorschläge</p>
<p>@Volkert Nein, es geht hier nicht um das zwischenspeichern von Ergebnissen, sondern um die Optimierung von get&amp;set-Methoden. Wenn es sich bei dem Rechteck um eines handelt, bei dem sich häufig Seitenlängen ändert ist Implementierung 1. angesagt. Wenn die Seitenlängen sich selten ändern aber häufig die Fläche benötigt wird, dann ist Implementierung 2. die bessere Lösung. Wenn aber die Zugriffe häufig zwischen Lesen und Schreiben wechseln, ist die 3. Implementation die günstigste Lösung. Daß hierfür Ergebnisse zwischengespeichert werden müssen, ist ebend unumgänglich. Diesen Punkt heranzuziehen um das ganze &quot;Caching&quot; zu nennen, gefällt mir nicht. Ich selber nenne es für mich auf denglisch Data-Flow-Optimation - also Datenfluß-Optimierung. Findet jemand diesen Begriff anstößig?</p>
</blockquote>
<p>Lol. Solange du aber *nicht* mehr ausser nur Caching machst IST es eben einfach Caching und keine &quot;Datenflussoptimierung&quot; oder sonstwas.<br />
Mann, Mann, Mann ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1247556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247556</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 18 Mar 2007 01:42:33 GMT</pubDate></item><item><title><![CDATA[Reply to get&amp;amp;set-Optimierung on Sun, 18 Mar 2007 10:52:07 GMT]]></title><description><![CDATA[<p>Denkt an:</p>
<pre><code>rule number one of optimization:
don't do it.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1247624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247624</guid><dc:creator><![CDATA[dontdoit]]></dc:creator><pubDate>Sun, 18 Mar 2007 10:52:07 GMT</pubDate></item></channel></rss>