<?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[Geschwindigkeit einiger Operationen]]></title><description><![CDATA[<p>Ich frage mich, ob folgende Operationen sich in der Ausführ-Geschwindigkeit unterscheiden:</p>
<p><strong>1. Vergleich</strong></p>
<pre><code class="language-cpp">if(3!=4);
</code></pre>
<p>und</p>
<pre><code class="language-cpp">if(3&gt;4);
</code></pre>
<p>Ist es Performancegünstiger auf Ungleichheit oder auf größer/kleiner zu testen?</p>
<p><strong>2. Inkrementieren</strong></p>
<pre><code class="language-cpp">++i;
</code></pre>
<p>und</p>
<pre><code class="language-cpp">i=i+1;
</code></pre>
<p>Ist hier die (pre)Inkrementierung schneller? Denn immerhin gibt es ja nur eine mögliche Addition. Vielleicht lässt sich das ja effektiver implementieren</p>
<p><strong>3. Vergleichen II</strong></p>
<pre><code class="language-cpp">int x = 0;
</code></pre>
<pre><code class="language-cpp">if(x)
</code></pre>
<p>und</p>
<pre><code class="language-cpp">if(x==0)
</code></pre>
<p>Im zweiten Fall muss erst der Vergleichoperator durchgeführt werden, der dann den Wert zurück gibt, der erst dann von if ausgewertet wird. Somit müsste doch erstere Variante schneller sein, oder?</p>
<p><strong>4. bool vs. int</strong></p>
<pre><code class="language-cpp">bool x = 1;
int y = 1;
</code></pre>
<pre><code class="language-cpp">while(x)
</code></pre>
<p>und</p>
<pre><code class="language-cpp">while(y)
</code></pre>
<p>In dem Falle müsste doch das 1. schneller sein, da im 2. Fall int erst in bool convertiert werden muss, oder?</p>
<p><strong>5. Anweisungsblock</strong></p>
<pre><code class="language-cpp">if(x)
   dosomething;
</code></pre>
<p>und</p>
<pre><code class="language-cpp">if(x)
{
   dosomething;
}
</code></pre>
<p>Wirken sich hier die Klammern des Anweisungsblockes auf die Performance aus? Ich kanns mir zwar nicht vorstellen, aber die werden ja wohl irgendwie vom compiler berücksichtig werden, oder?</p>
<p>Schonmal Danke im Voraus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/230790/geschwindigkeit-einiger-operationen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 22:15:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/230790.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 02 Jan 2009 05:21:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Fri, 02 Jan 2009 05:21:32 GMT]]></title><description><![CDATA[<p>Ich frage mich, ob folgende Operationen sich in der Ausführ-Geschwindigkeit unterscheiden:</p>
<p><strong>1. Vergleich</strong></p>
<pre><code class="language-cpp">if(3!=4);
</code></pre>
<p>und</p>
<pre><code class="language-cpp">if(3&gt;4);
</code></pre>
<p>Ist es Performancegünstiger auf Ungleichheit oder auf größer/kleiner zu testen?</p>
<p><strong>2. Inkrementieren</strong></p>
<pre><code class="language-cpp">++i;
</code></pre>
<p>und</p>
<pre><code class="language-cpp">i=i+1;
</code></pre>
<p>Ist hier die (pre)Inkrementierung schneller? Denn immerhin gibt es ja nur eine mögliche Addition. Vielleicht lässt sich das ja effektiver implementieren</p>
<p><strong>3. Vergleichen II</strong></p>
<pre><code class="language-cpp">int x = 0;
</code></pre>
<pre><code class="language-cpp">if(x)
</code></pre>
<p>und</p>
<pre><code class="language-cpp">if(x==0)
</code></pre>
<p>Im zweiten Fall muss erst der Vergleichoperator durchgeführt werden, der dann den Wert zurück gibt, der erst dann von if ausgewertet wird. Somit müsste doch erstere Variante schneller sein, oder?</p>
<p><strong>4. bool vs. int</strong></p>
<pre><code class="language-cpp">bool x = 1;
int y = 1;
</code></pre>
<pre><code class="language-cpp">while(x)
</code></pre>
<p>und</p>
<pre><code class="language-cpp">while(y)
</code></pre>
<p>In dem Falle müsste doch das 1. schneller sein, da im 2. Fall int erst in bool convertiert werden muss, oder?</p>
<p><strong>5. Anweisungsblock</strong></p>
<pre><code class="language-cpp">if(x)
   dosomething;
</code></pre>
<p>und</p>
<pre><code class="language-cpp">if(x)
{
   dosomething;
}
</code></pre>
<p>Wirken sich hier die Klammern des Anweisungsblockes auf die Performance aus? Ich kanns mir zwar nicht vorstellen, aber die werden ja wohl irgendwie vom compiler berücksichtig werden, oder?</p>
<p>Schonmal Danke im Voraus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638202</guid><dc:creator><![CDATA[guden]]></dc:creator><pubDate>Fri, 02 Jan 2009 05:21:32 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Fri, 02 Jan 2009 06:14:23 GMT]]></title><description><![CDATA[<p>schau dir einfach den vom compiler erzeugten assemblerocde an (im releasemode)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638210</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638210</guid><dc:creator><![CDATA[tipp]]></dc:creator><pubDate>Fri, 02 Jan 2009 06:14:23 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Fri, 02 Jan 2009 07:48:56 GMT]]></title><description><![CDATA[<p>ich gehe im zweifelsfall davon aus, daß die optimierungen eingeschaltet sind.</p>
<p>guden schrieb:</p>
<blockquote>
<p><strong>1. Vergleich</strong></p>
<pre><code class="language-cpp">if(3!=4);
</code></pre>
<p>und</p>
<pre><code class="language-cpp">if(3&gt;4);
</code></pre>
<p>Ist es Performancegünstiger auf Ungleichheit oder auf größer/kleiner zu testen?</p>
</blockquote>
<p>völlig gleich schnell.<br />
aaber, wenn if(i&gt;j) und if(i!=j) kann, wenn i und j iteratoren sind, erheblich anders sein, generell sind == und != schnell und die anderen vergleiche können überraschend sein, nämlich wenn sie in verkettete listen reinzeigen.</p>
<p>guden schrieb:</p>
<blockquote>
<p><strong>2. Inkrementieren</strong></p>
<pre><code class="language-cpp">++i;
</code></pre>
<p>und</p>
<pre><code class="language-cpp">i=i+1;
</code></pre>
<p>Ist hier die (pre)Inkrementierung schneller? Denn immerhin gibt es ja nur eine mögliche Addition. Vielleicht lässt sich das ja effektiver implementieren</p>
</blockquote>
<p>bei int wieder echt gleich. bei iteratoren ist ++i am schnellsten (weil eine referenz auf *this zurückgegeben werden kann), danach kommt i++ (weil eine kopie des alten werts zurückgegeben werden muß) und noch eine winzigkeit später ist i=i+1 (bei listen, weil erstmal die schleife angeworfen wird).</p>
<p>guden schrieb:</p>
<blockquote>
<p><strong>3. Vergleichen II</strong></p>
<pre><code class="language-cpp">int x = 0;
</code></pre>
<pre><code class="language-cpp">if(x)
</code></pre>
<p>und</p>
<pre><code class="language-cpp">if(x==0)
</code></pre>
<p>Im zweiten Fall muss erst der Vergleichoperator durchgeführt werden, der dann den Wert zurück gibt, der erst dann von if ausgewertet wird. Somit müsste doch erstere Variante schneller sein, oder?</p>
</blockquote>
<p>bei int wieder exakt gleich schnell, bei klassen gewinnt if(x).</p>
<p>guden schrieb:</p>
<blockquote>
<p><strong>4. bool vs. int</strong></p>
<pre><code class="language-cpp">bool x = 1;
int y = 1;
</code></pre>
<pre><code class="language-cpp">while(x)
</code></pre>
<p>und</p>
<pre><code class="language-cpp">while(y)
</code></pre>
<p>In dem Falle müsste doch das 1. schneller sein, da im 2. Fall int erst in bool convertiert werden muss, oder?</p>
</blockquote>
<p>kann ich nicht sagen. ich vermute, sie sind gleich schnell. es muß nicht konvertiert werden, denke ich.</p>
<p>guden schrieb:</p>
<blockquote>
<p><strong>5. Anweisungsblock</strong></p>
<pre><code class="language-cpp">if(x)
   dosomething;
</code></pre>
<p>und</p>
<pre><code class="language-cpp">if(x)
{
   dosomething;
}
</code></pre>
<p>Wirken sich hier die Klammern des Anweisungsblockes auf die Performance aus? Ich kanns mir zwar nicht vorstellen, aber die werden ja wohl irgendwie vom compiler berücksichtig werden, oder?</p>
</blockquote>
<p>völlig gleich. es ist egal, ob der sprung über 10 oder über 50 bytes geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638214</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638214</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 02 Jan 2009 07:48:56 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Fri, 02 Jan 2009 08:56:59 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>guden schrieb:</p>
<blockquote>
<p><strong>3. Vergleichen II</strong></p>
<pre><code class="language-cpp">int x = 0;
</code></pre>
<pre><code class="language-cpp">if(x)
</code></pre>
<p>und</p>
<pre><code class="language-cpp">if(x==0)
</code></pre>
<p>Im zweiten Fall muss erst der Vergleichoperator durchgeführt werden, der dann den Wert zurück gibt, der erst dann von if ausgewertet wird. Somit müsste doch erstere Variante schneller sein, oder?</p>
</blockquote>
<p>bei int wieder exakt gleich schnell, bei klassen gewinnt if(x).</p>
</blockquote>
<p>Meinst du jetzt Pointer auf NULL prüfen, da wird doch der Compiler in beiden Fällen den gleichen Code erzeugen. Oder meinst du safe bool?</p>
<blockquote>
<blockquote>
<p>[/cpp]Wirken sich hier die Klammern des Anweisungsblockes auf die Performance aus? Ich kanns mir zwar nicht vorstellen, aber die werden ja wohl irgendwie vom compiler berücksichtig werden, oder?</p>
</blockquote>
<p>völlig gleich. es ist egal, ob der sprung über 10 oder über 50 bytes geht.</p>
</blockquote>
<p>Klammern erzeugen keine Bytes.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638225</guid><dc:creator><![CDATA[lenkrad]]></dc:creator><pubDate>Fri, 02 Jan 2009 08:56:59 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Fri, 02 Jan 2009 09:09:10 GMT]]></title><description><![CDATA[<blockquote>
<p>Meinst du jetzt Pointer auf NULL prüfen, da wird doch der Compiler in beiden Fällen den gleichen Code erzeugen. Oder meinst du safe bool?</p>
</blockquote>
<p>ich meinte irgendwelche operatoren, die if(x) erlauben, zum beispiel safe bool. unterschiede nur, wenn x eine instanz einer klasse ist und die überladung des op== nicht inline ist und deswegen der optimierer nicht zuschlagen kann.</p>
<blockquote>
<p>Klammern erzeugen keine Bytes.</p>
</blockquote>
<p>klar. ich hatte irgendwie im kopf, daß di8e version mit klammern nur gemacht worden sein konnte, weil mehrere anweisungen da stehen. ist ja gar nicht so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638227</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 02 Jan 2009 09:09:10 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Fri, 02 Jan 2009 15:48:07 GMT]]></title><description><![CDATA[<p>falls es dir so auf performance ankommt, dann nimm</p>
<pre><code class="language-cpp">for (;;)
{
   //...
}
</code></pre>
<p>und nicht</p>
<pre><code class="language-cpp">while (true)
{
   //...
};
</code></pre>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638417</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 02 Jan 2009 15:48:07 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Fri, 02 Jan 2009 15:52:07 GMT]]></title><description><![CDATA[<p>falls das jetzt so weiter geht, sag ich mal, dass das unwichtige premature microoptimierung ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638419</guid><dc:creator><![CDATA[lenkrad]]></dc:creator><pubDate>Fri, 02 Jan 2009 15:52:07 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Fri, 02 Jan 2009 15:54:19 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>falls es dir so auf performance ankommt, dann nimm</p>
<pre><code class="language-cpp">for (;;)
{
   //...
}
</code></pre>
<p>und nicht</p>
<pre><code class="language-cpp">while (true)
{
   //...
};
</code></pre>
<p>bb</p>
</blockquote>
<p>Glaub ich übrigens nicht, dass das der compiler nicht selber merkt und das gleiche draus macht. Hast du nen Beweis dafür?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638421</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638421</guid><dc:creator><![CDATA[lenkrad]]></dc:creator><pubDate>Fri, 02 Jan 2009 15:54:19 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Fri, 02 Jan 2009 16:08:46 GMT]]></title><description><![CDATA[<p>Ein guter Compiler sollte so gar ne Warnung ausgeben, dass die Abbruch-Bedingung konstant ist ^^</p>
<p>MSVC:<br />
auf</p>
<pre><code class="language-cpp">while(true) {};
</code></pre>
<p>folgt</p>
<pre><code>1&gt;.\main.cpp(23) : warning C4127: conditional expression is constant
</code></pre>
<p>Abgesehen von der Warnung ist das Ergebnis aber wirklich gleich...</p>
<p>Die Funktion, die die Schleife aufruft, damit die nicht komplett wegoptimiert wird - noinline damit man im disassembly auch durchsieht ^^</p>
<pre><code class="language-cpp">__declspec(noinline) void func()
{
	std::cout &lt;&lt; &quot;a&quot;;
}
</code></pre>
<pre><code class="language-cpp">for (;;)
	{
		func();
01091010  call        func (1091000h) 
	}
01091015  jmp         main (1091010h)
</code></pre>
<pre><code class="language-cpp">while (true)
	{
		func();
00D91010  call        func (0D91000h) 
	};
00D91015  jmp         main (0D91010h)
</code></pre>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638431</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 02 Jan 2009 16:08:46 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Sat, 03 Jan 2009 14:43:57 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>aaber, wenn if(i&gt;j) und if(i!=j) kann, wenn i und j iteratoren sind, erheblich anders sein, generell sind == und != schnell und die anderen vergleiche können überraschend sein, nämlich wenn sie in verkettete listen reinzeigen.</p>
</blockquote>
<p>Aus diesem Grund implementieren die Iteratoren verketteter Listen Operatoren wie <code>&lt;</code> , <code>&lt;=</code> , <code>&gt;</code> , <code>&gt;=</code> und auch <code>+</code> , <code>+=</code> , <code>-</code> , <code>-=</code> üblicherweise nicht. Da müsste man schon zu <code>std::advance()</code> und <code>std::distance()</code> greifen.</p>
<p>unskilled schrieb:</p>
<blockquote>
<p>Abgesehen von der Warnung ist das Ergebnis aber wirklich gleich...</p>
<p>Die Funktion, die die Schleife aufruft, damit die nicht komplett wegoptimiert wird - noinline damit man im disassembly auch durchsieht ^^</p>
</blockquote>
<p>In der Regel sollte man aber davon ausgehen können, dass Optimierungen an sind, und somit ist auch die <code>noinline</code> -Nötigung für den Praxisfall irrelevant.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638838</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638838</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 03 Jan 2009 14:43:57 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Sat, 03 Jan 2009 15:25:23 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>unskilled schrieb:</p>
<blockquote>
<p>Die Funktion, die die Schleife aufruft, damit die nicht komplett wegoptimiert wird - noinline <strong>damit man im disassembly auch durchsieht</strong> ^^</p>
</blockquote>
<p>In der Regel sollte man aber davon ausgehen können, dass Optimierungen an sind, und somit ist auch die <code>noinline</code> -Nötigung für den Praxisfall irrelevant.</p>
</blockquote>
<p>Es ging ja auch nicht um den Praxisfall - habs extra noch mal fett für dich geschrieben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /> ^^<br />
Es ging einfach nur darum etwas in der Schleife zu machen und im Disassembly trotzdem noch ganz einfach durchzusehen - weil dort halt kein std::cout gedöns steht sondern viel eher nur ein simpler funktions-aufruf</p>
<p>bb</p>
<p>PS: Trotzdem ist while (true) imho eine doofe endlosschleife und man sollte for ( ;; ) bevorzugen - es erzeugt einfach keine warnings - und das es normalerweise ne warning zur Folge hat zeigt imho ja nur, dass es nicht der richtige Weg ist!? außerdem hat man bei der for-schleife die gleiche möglichkeit, doch eine abbruch-bedingung einzubringen - und hat auch den vorteil, dass man variablen im schleifenkopf initlialisieren kann etc.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638857</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 03 Jan 2009 15:25:23 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Sat, 03 Jan 2009 15:40:13 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>- es erzeugt einfach keine warnings - und das es normalerweise ne warning zur Folge hat zeigt imho ja nur, dass es nicht der richtige Weg ist!?</p>
</blockquote>
<p>Nein. Je nach Kontext können Warnings entstehen. Es sind ja deshalb nur Warnungen und keine Fehler, weil sie nur darauf hinweisen, dass man möglicherweise etwas falsch macht. Schau beispielsweise mal in Standard- oder Boost-Header, da werden teilweise Warnungen systematisch deaktiviert.</p>
<p>unskilled schrieb:</p>
<blockquote>
<p>außerdem hat man bei der for-schleife die gleiche möglichkeit, doch eine abbruch-bedingung einzubringen - und hat auch den vorteil, dass man variablen im schleifenkopf initlialisieren kann etc.</p>
</blockquote>
<p>Es geht aber nicht um die Vorteile von For- gegenüber While-Schleifen. Wir betrachten hier nur den Fall einer Endlosschleife, da sind Schleifenkopf-Anweisungen nicht wichtig.</p>
<p>Ich finde, es ist eher Geschmackssache, was man verwendet. Auch wenn <code>for(;; )</code> die nativere Variante ist, kann es gut sein, dass man <code>while(true)</code> besser findet, sei es, weil man die Endlosschleife schneller erkennt. Aber im Zweifelsfalle ist <code>for</code> hier schon besser, da stimme ich dir zu. Und da solche Schleifen sowieso ziemlich selten vorkommen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638861</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638861</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 03 Jan 2009 15:40:13 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Sat, 03 Jan 2009 16:28:24 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>unskilled schrieb:</p>
<blockquote>
<p>- es erzeugt einfach keine warnings - und das es normalerweise ne warning zur Folge hat zeigt imho ja nur, dass es nicht der richtige Weg ist!?</p>
</blockquote>
<p>Nein. Je nach Kontext können Warnings entstehen. Es sind ja deshalb nur Warnungen und keine Fehler, weil sie nur darauf hinweisen, dass man möglicherweise etwas falsch macht. Schau beispielsweise mal in Standard- oder Boost-Header, da werden teilweise Warnungen systematisch deaktiviert.</p>
</blockquote>
<p>Das weiß ich ^^<br />
Aber man spart sich eben so eine weitere Warning auszublenden...<br />
Erspart mir im besten Falle 2 Dateien - da meine Source-Codes immer so aussehen:</p>
<pre><code class="language-cpp">#include &quot;header.h&quot;

#include &quot;warnings_off.h&quot;

//implementationen

#include &quot;warnings_on.h&quot;
</code></pre>
<p>und wenn es eine variante gibt, die mir keine warnings bringt und trotzdem keine nachteile hat... warum sollte ich mich nicht für diese entscheiden?</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638884</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 03 Jan 2009 16:28:24 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Sat, 03 Jan 2009 16:33:09 GMT]]></title><description><![CDATA[<p>Ja, du hast schon Recht, grundsätzlich ist <code>for(;; )</code> schon besser. Ich finde es nur nicht tragisch, wenn jetzt jemand <code>while(true)</code> schreibt.</p>
<p>Mit meiner Aussage bezog ich mich auch auf deinen eher allgemeinen Satz, dass Warnungen auf den falschen Weg hinweisen würden.</p>
<p>Aber ich denke, wir sind uns einig. <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/1638887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638887</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 03 Jan 2009 16:33:09 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Sat, 10 Jan 2009 21:27:07 GMT]]></title><description><![CDATA[<p>Du kannst bei Funktionen die Variablen als Referenzen übergeben:</p>
<p>z.B.</p>
<pre><code>int add(int&amp; a, int&amp; b)
{
  return (a + b);
}
</code></pre>
<p>ist besser als</p>
<pre><code>int add(int a, int b)
{
  return (a + b);
}
</code></pre>
<p>Wenn Du vergleiche mit 0 machst, ist das besser, wenn Du</p>
<p>bool b = (a != 0)</p>
<p>alse wenn Du</p>
<p>bool b = (a &gt; 0) schreibst, weil da intern nur die Register verglichen werden.</p>
<p>Hoffe, das kann Dir weiter helfen.</p>
<p>Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1643115</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1643115</guid><dc:creator><![CDATA[Senfer]]></dc:creator><pubDate>Sat, 10 Jan 2009 21:27:07 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Sat, 10 Jan 2009 21:55:04 GMT]]></title><description><![CDATA[<p>Das mit den Referenzen lohnt sich bei skalaren Typen wahrscheinlich eher nicht, da diese sehr schnell kopiert werden und die Dereferenzierung auch Zeit braucht. Mal abgesehen von der Semantik, der eher eine Const-Referenz angemessen wäre.</p>
<p>Und wie meinst du das genau mit den Registern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1643126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1643126</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 10 Jan 2009 21:55:04 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Sat, 10 Jan 2009 23:01:08 GMT]]></title><description><![CDATA[<p>Das mit den Referenzen mach ich selber gerade. Hab ich aber von hier:</p>
<p>[url]<br />
<a href="http://www.mathematik.uni-marburg.de/~cpp/referenzen/" rel="nofollow">http://www.mathematik.uni-marburg.de/~cpp/referenzen/</a><br />
[/url]<br />
Kapitel Referenzübergabe. Der Funktionsaufruf kostet natürlich Zeit, da hast Du recht.</p>
<p>Das mit den Registern ist so:</p>
<p>Ich hab das von nem Guru, der Steuergeräte (für Autos) programmiert und dafür alles mögliche irgendwelche Optimierungen kennt.</p>
<p>Mit Register meine ich die Speicherzellen. D.h. der Vergleich wird direkt im Speicher durchgeführt, was anscheinend schneller ist, aber genau kenn ich mich da auch nicht aus.</p>
<p>Hab aber gerade einen Performancetest gemacht:</p>
<p>Wenn Du Windows hast und Deine Entwicklungsumgebung das unterstützt, kannst Du das auch kurz machen:</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt; 
#include &lt;iosteam&gt;

#include &lt;windows.h&gt;

using namespace std;

int main(int argc, char *argv[])
{
   int iGrenze = 100000000;

   DWORD dwStart1 = 0;
   DWORD dwStart2 = 0;
   DWORD dwStop1 = 0;
   DWORD dwStop2 = 0;

   bool x = false;

   dwStart1 = GetTickCount();

   for(int i = 0; i &lt; iGrenze; i++)
      x = (i &gt; 0);

   dwStop1 = GetTickCount();
   dwStart2 = GetTickCount();

   for(int i = 0; i &lt; iGrenze; i++)
      x = (i == 0);

   dwStop2 = GetTickCount();

   cout &lt;&lt; &quot;Test 1: &quot; &lt;&lt; dwStop1 - dwStart1 &lt;&lt; endl;
   cout &lt;&lt; &quot;Test 1: &quot; &lt;&lt; dwStop2 - dwStart2 &lt;&lt; endl;

}
</code></pre>
<p>Das kannst Du ein paar mal machen, kommt aber immer raus, dass das untere um ca. ein fünftel schneller ist.</p>
<p>(hoffe, ich hab den Code richtig abgetippt, war nämlich auf dem anderen Rechner <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/1643139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1643139</guid><dc:creator><![CDATA[Senfer]]></dc:creator><pubDate>Sat, 10 Jan 2009 23:01:08 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Sat, 10 Jan 2009 23:16:50 GMT]]></title><description><![CDATA[<p>Das geht auch mit den Referenzen:</p>
<p>Da ist auch die Referenz um ca. ein fünftel schneller;</p>
<pre><code class="language-cpp">int addVal(int a, int b)
{ return (a + b); }

int addRef(int&amp; a, int&amp; b
{ return (a + b); }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1643145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1643145</guid><dc:creator><![CDATA[Senfer]]></dc:creator><pubDate>Sat, 10 Jan 2009 23:16:50 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Sat, 10 Jan 2009 23:20:19 GMT]]></title><description><![CDATA[<p>dann vertausch mal oben und unten. dann ist schon wieder das untere schneller. oder?</p>
<p>zum messen solltest du alle optimierungen anmachen und von hunderten von messungen diejenige mit der kleinsten zeit nehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1643146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1643146</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 10 Jan 2009 23:20:19 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Sat, 10 Jan 2009 23:24:57 GMT]]></title><description><![CDATA[<p>hab ich gerade gemacht. Kein Unterschied.</p>
<p>Auch mit den Optimierungen ein (da sind natürlich jetzt wahrscheinlich keine MMX, SSE-Optimierungen drin).</p>
<p>Messungen hab ich so an die zehn gemacht, aber das Ergebnis ist immer ungefähr das gleiche.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1643149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1643149</guid><dc:creator><![CDATA[Senfer]]></dc:creator><pubDate>Sat, 10 Jan 2009 23:24:57 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Sat, 10 Jan 2009 23:37:08 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>und von hunderten von messungen diejenige mit der kleinsten zeit nehmen.</p>
</blockquote>
<p>Wäre es nicht sinnvoller, den Mittelwert zu nehmen? Ausreisser gibt es immer, und die sind nicht praxisrelevant.</p>
<p>Ich habe die Messung wegen &lt; und == übrigens auch gemacht, mit anderen Zeitmessungs-Funktionen. Beides war ziemlich genau gleich schnell. Gleiches gilt für Referenz und Kopie. Wahrscheinlich kann das der Compiler gut optimieren.</p>
<p>Senfer schrieb:</p>
<blockquote>
<p>Das mit den Referenzen mach ich selber gerade. Hab ich aber von hier:</p>
<p><a href="http://www.mathematik.uni-marburg.de/~cpp/referenzen/" rel="nofollow">http://www.mathematik.uni-marburg.de/~cpp/referenzen/</a><br />
Kapitel Referenzübergabe. Der Funktionsaufruf kostet natürlich Zeit, da hast Du recht.</p>
</blockquote>
<p>Nicht der Aufruf, die Dereferenzierung. Und schau mal, was dort steht:</p>
<blockquote>
<p>3. Da nichts kopiert und vor allem kein Konstruktor aufgerufen werden muß, entsteht ein Laufzeitvorteil.</p>
</blockquote>
<p>Bei Klassentypen lohnt sich eine Const-Referenz-Übergabe schon von der Performance her. Da skalare Typen aber so klein sind und keine Konstruktoren haben, lohnt es sich nicht wirklich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1643153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1643153</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 10 Jan 2009 23:37:08 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Sat, 10 Jan 2009 23:37:57 GMT]]></title><description><![CDATA[<p>Die Messungen sollten richtig sein, der TickCount kann laut</p>
<p>MSDN:</p>
<p>[url]<br />
<a href="http://msdn.microsoft.com/en-us/library/ms724408(VS.85).aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/ms724408(VS.85).aspx</a><br />
[/url]</p>
<p>ca. 47 Tage lang laufen, ohne dass er auf Null zurück springt.</p>
<p>Aber mit dem an den Kern binden hast Du natürlich recht. Ich glaube jedoch wirklich, die Messungen einigermaßen ok sind, habe es jetzt noch mal auf 1 Mrd. erhöht und noch mal ca. 20 Messungen mit vertauschen gemacht.</p>
<p>Die Referenzen und der Vergleich auf 0 ist immer noch ca. 20% schneller.</p>
<p>Aber ich lass mich gern vom Gegenteil überzeugen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1643154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1643154</guid><dc:creator><![CDATA[Senfer]]></dc:creator><pubDate>Sat, 10 Jan 2009 23:37:57 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Sat, 10 Jan 2009 23:41:06 GMT]]></title><description><![CDATA[<p>Ok, wahrscheinlich hast Du recht und Du kennst Dich auch besser mit den Optimierungsfunktionalitäten der Compiler aus. Das mit C++ ist schon ne Weile her bei mir. Ich hab erst vor ein paar Wochen wieder angefangen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1643155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1643155</guid><dc:creator><![CDATA[Senfer]]></dc:creator><pubDate>Sat, 10 Jan 2009 23:41:06 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Sat, 10 Jan 2009 23:51:55 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>und von hunderten von messungen diejenige mit der kleinsten zeit nehmen.</p>
</blockquote>
<p>Wäre es nicht sinnvoller, den Mittelwert zu nehmen? Ausreisser gibt es immer, und die sind nicht praxisrelevant.</p>
</blockquote>
<p>die ausreißer liegen aber absolut nicht am eigenen code. die kommen, weil andere prozesse die cpu bekommen, die kommen, weil code eingelagert werden muss, die kommen weil der prozessorcache noch leer war, man hat den eindruck, die kämen einfach so.<br />
mit einfach einer langen schleife und dem mittelwert fällst du ganz super auf die effekte rein, daß der rechner schneller ist, wenn er vorher ein paar sekunden ruhen durfte, daß die zweite schleife im selben prog normalerweise gewinnt (vielleicht weil keine nachwirkungen des einlagerns mehr laufen und freispeicher schon im pool ist, oder weil die anderen programme (der explorer, die ide) endlich ausgezappelt haben).<br />
kleine sachen wie x+=(i==0) versus x+=(i&lt;=0) kann man zuverlässig auf den takt genau ausmessen, indem man kurzlaufende schleifen nimmt (so, daß es öfters mal vorkommt, daß ein ganzer durchlauf ohne prozesswechsel klappt) und von vielen versuchen den schnellsten nimmt.</p>
<p>andere sachen müssen anders gemessen werden, für eine new-funktion lieber mittelwert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1643157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1643157</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 10 Jan 2009 23:51:55 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Sat, 10 Jan 2009 23:58:34 GMT]]></title><description><![CDATA[<p>Da hast Du recht. Mit dem Mittelwert stimme ich mit Dir überein. Aber über längere Zeiträume sollten die Interrupts des Systems doch eigentlich auch rausgemittelt werden oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1643162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1643162</guid><dc:creator><![CDATA[Senfer]]></dc:creator><pubDate>Sat, 10 Jan 2009 23:58:34 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit einiger Operationen on Sun, 11 Jan 2009 00:03:33 GMT]]></title><description><![CDATA[<p>Ich programmier mir jetzt mal was mit 1 000 000 Messungen, die über schleifen von einmal 100 und einmal 1 000 000 000 Durchläufen gehen. Sollte etwas länger dauern, aber dann sollten sich die Interrupts eigentlich statistisch raus mitteln, wenn ich den Mittelwert bilde (und auch nichts anderes an dem Rechner mache).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1643163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1643163</guid><dc:creator><![CDATA[Senfer]]></dc:creator><pubDate>Sun, 11 Jan 2009 00:03:33 GMT</pubDate></item></channel></rss>