<?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[Verschachtelte If-Abfragen oder doch abbrechen?]]></title><description><![CDATA[<p>Hi.<br />
Was ist besser? Gibt es möglicherweise Unterschiede im ASM Code (Länge, Performance)?</p>
<pre><code class="language-cpp">void bla()
{
    if (x &lt; 1)
    {
        return;
    }

    // code...
}

// oder

void bla()
{
    if (x &gt; 0)
    {
        // code...
    }
}
</code></pre>
<p>Edit: Ist <code>x &gt;= 1</code> eigentlich langsamer als <code>x &gt; 0</code> ?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/265572/verschachtelte-if-abfragen-oder-doch-abbrechen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 02:41:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/265572.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 25 Apr 2010 16:29:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verschachtelte If-Abfragen oder doch abbrechen? on Sun, 25 Apr 2010 16:30:22 GMT]]></title><description><![CDATA[<p>Hi.<br />
Was ist besser? Gibt es möglicherweise Unterschiede im ASM Code (Länge, Performance)?</p>
<pre><code class="language-cpp">void bla()
{
    if (x &lt; 1)
    {
        return;
    }

    // code...
}

// oder

void bla()
{
    if (x &gt; 0)
    {
        // code...
    }
}
</code></pre>
<p>Edit: Ist <code>x &gt;= 1</code> eigentlich langsamer als <code>x &gt; 0</code> ?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888144</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Sun, 25 Apr 2010 16:30:22 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte If-Abfragen oder doch abbrechen? on Sun, 25 Apr 2010 16:38:48 GMT]]></title><description><![CDATA[<p>So wie ich das beurteilen kann, sollte das keinen Unterschied machen. Und dein Edit sollte auch nichts ausmachen, selbst wenn, ist die Zeit, die man da gewinnt, überhaupt noch messbar ? <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/1888150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888150</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Sun, 25 Apr 2010 16:38:48 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte If-Abfragen oder doch abbrechen? on Sun, 25 Apr 2010 16:39:40 GMT]]></title><description><![CDATA[<p>Klingt sehr stark nach Mikrooptimierung.<br />
Sagen wir es so: Auch wenn es einen Unterschied macht, musst du so etwas nicht beachten.</p>
<p>Mach das, was logisch in den Code passt.</p>
<p>Alles andere kann man sowieso nicht allgemeingültig beantworten, sondern ist abhängig vom Compiler und dessen Optimierungen.</p>
<p>Falls du in die Verlegenheit kommst deinen Code zu optimieren, dann wird das zu 99.99% nicht an dieser Stelle liegen und falls doch, dann hättest du das ja schnell geändert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888151</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 25 Apr 2010 16:39:40 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte If-Abfragen oder doch abbrechen? on Sun, 25 Apr 2010 16:52:17 GMT]]></title><description><![CDATA[<p>Hi.<br />
Dass man die Optimierungen nicht bemerken wird ist mir klar, nur es interessierte mich gerade.</p>
<p>Danke!</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888155</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Sun, 25 Apr 2010 16:52:17 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte If-Abfragen oder doch abbrechen? on Sun, 25 Apr 2010 16:55:14 GMT]]></title><description><![CDATA[<p>Warum compiliert es keiner, um mal den ASM-Code anzuschauen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888157</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 25 Apr 2010 16:55:14 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte If-Abfragen oder doch abbrechen? on Sun, 25 Apr 2010 17:01:23 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Warum compiliert es keiner, um mal den ASM-Code anzuschauen?</p>
</blockquote>
<p>Weil das die Aufgabe von theliquidwave, wenn er sich dafür interessiert. Das es Compilerabhängig ist, was da produziert wird habe ich ja bereits gesagt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888160</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 25 Apr 2010 17:01:23 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte If-Abfragen oder doch abbrechen? on Sun, 25 Apr 2010 17:11:14 GMT]]></title><description><![CDATA[<p>Ich kann mir da nur zwei Szenarien vorstellen (Pseudo-Code).</p>
<p>Im ersten Fall:</p>
<pre><code class="language-cpp">JumpIfGreater L_IfEnd
Return
:L_IfEnd
[...Code...]
</code></pre>
<p>Im zweiten Fall:</p>
<pre><code class="language-cpp">JumpIfSmaller L_IfEnd
[...Code...]
:L_IfEnd
Return
</code></pre>
<p>Sogesehen müsste die erste Variante schneller sein, da kein Spruch erforderlich ist. Andererseits könnte der Compiler die Situation auch anders lösen. Das ganze dürfte sich maximal um eine Operation unterscheiden. Ich gehe aber davon aus, dass der Compiler sowas selbstständig optimiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888162</guid><dc:creator><![CDATA[hhjkhjk]]></dc:creator><pubDate>Sun, 25 Apr 2010 17:11:14 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte If-Abfragen oder doch abbrechen? on Sun, 25 Apr 2010 17:15:06 GMT]]></title><description><![CDATA[<p>Gibt ja auch noch so spaßige Sachen wie Branch Prediction in der CPU, die man in der Praxis auch berücksichtigen muss.</p>
<p>Besser ist das, was leichter zu lesen ist. In Sachen Performance kann man keine allgemein gültige Aussage machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888167</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Sun, 25 Apr 2010 17:15:06 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte If-Abfragen oder doch abbrechen? on Sun, 25 Apr 2010 17:24:25 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>Was ist besser?</p>
</blockquote>
<p>Vielleicht ist die richtige Wahl des Datentypen von <strong>x</strong> besser. Ist <strong>x</strong> unsigned, so wird &quot;Macro-fusion&quot; der betroffenen Befehle in der Intel CPU aktiv, was angeblich perfomanter sein soll (s. ähnliche Diskussion hier <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-252326-and-postdays-is-0-and-postorder-is-asc-and-start-is-60.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-252326-and-postdays-is-0-and-postorder-is-asc-and-start-is-60.html</a>).<br />
D.h. so was wäre wahrscheinlich besser:</p>
<pre><code class="language-cpp">unsigned int x;

    ...

    if (x != 0u)
    {
        ...
    }
}
</code></pre>
<p>Also alles <strong>unsigned</strong>, auch die Null (<strong>0u</strong> und nicht einfach <strong>0</strong>)...<br />
Ich habe es natürlich so nicht getestet und es könnte sein, dass es alles Quatsch ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888174</guid><dc:creator><![CDATA[abc.w]]></dc:creator><pubDate>Sun, 25 Apr 2010 17:24:25 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte If-Abfragen oder doch abbrechen? on Sun, 25 Apr 2010 17:25:24 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;ctime&gt;

int x=std::time(0);

void bla() 
{
#if 1
    if (x &lt; 1) 
    { 
        return; 
    } 
    std::cout&lt;&lt;&quot;&quot;;
#else
    if (x &gt; 0) 
    { 
        std::cout&lt;&lt;&quot;&quot;;
    } 
#endif
} 

int main() 
{ 
    bla();
}
</code></pre>
<p>gcc version 4.4.0 (GCC)<br />
g++ -O3 -march=native --save-temps main.cpp</p>
<pre><code class="language-asm">call	___main
	movl	_x, %eax
	testl	%eax, %eax
	jle	L6
	movl	$0, 8(%esp)
	movl	$LC0, 4(%esp)
	movl	$__ZSt4cout, (%esp)
	call	__ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i
L6:
	xorl	%eax, %eax
	leave
	ret
</code></pre>
<p>gegen</p>
<pre><code class="language-asm">call	___main
	movl	_x, %eax
	testl	%eax, %eax
	jle	L6
	movl	$0, 8(%esp)
	movl	$LC0, 4(%esp)
	movl	$__ZSt4cout, (%esp)
	call	__ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i
L6:
	xorl	%eax, %eax
	leave
	ret
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1888176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888176</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 25 Apr 2010 17:25:24 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte If-Abfragen oder doch abbrechen? on Sun, 25 Apr 2010 17:26:17 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>Hi.<br />
Dass man die Optimierungen nicht bemerken wird ist mir klar, nur es interessierte mich gerade.</p>
<p>Danke!</p>
<p>Gruß</p>
</blockquote>
<p>Zunächst gehen wir mal durch die IDE in den Compiler. Der ist eigentlich dazu ständig solche Optimierungen durchzuführen, er wird schon wissen, ob &quot;x &gt;= 1&quot; oder &quot;x &gt; 0&quot; schneller sein wird. Oder ob das abbrechen am Anfang der Funktion technisch sinnvoll ist oder nicht. Das ist auf Quelltext-Ebene eher eine Frage des Aussehen (oder Unternehmensvorschiften).</p>
<p>Schlussendlich hängt es vom Prozessor ab auf dem die Bits laufen. Soweit ich weiß, gibt es bei den allermeisten Befehlssätzen auf den CPU allgemein ein JUMPIFN und ein JUMPIFZ also wenn ein Register negativ ist oder 0. Also x == 0 und x &lt; 0 sind dann ein einziger Befehl. (Abgesehn von Positions des Wertes ermitteln, Wertpositions Offset relativ zur Klasse bstimmen, aus dem Speicher laden, etc..)<br />
Eigentlich kann dir das aber egal sein, denn, wenn du eine (ungecachte) Speicheroperation durchführst ist das garantiert (selbst ohne Pipeline-Hazards) langsamer als etliche &quot;if&quot;-Befehle. Wie schon von anderen gesagt, solltest du solche &quot;Kleinigkeiten&quot; immer den Compiler überlassen, er weiß' schon was er macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888177</guid><dc:creator><![CDATA[Rhombicosidodecahedron]]></dc:creator><pubDate>Sun, 25 Apr 2010 17:26:17 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte If-Abfragen oder doch abbrechen? on Sun, 25 Apr 2010 17:29:43 GMT]]></title><description><![CDATA[<p>Danke an Alle.<br />
@ abc.w: Man kann's auch übertreiben <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>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888178</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Sun, 25 Apr 2010 17:29:43 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte If-Abfragen oder doch abbrechen? on Sun, 25 Apr 2010 17:37:13 GMT]]></title><description><![CDATA[<p>abc.w schrieb:</p>
<blockquote>
<p>Vielleicht ist die richtige Wahl des Datentypen von <strong>x</strong> besser. Ist <strong>x</strong> unsigned, so wird &quot;Macro-fusion&quot; ...</p>
</blockquote>
<p>Mit unsigned wird statt jle nur je gemacht.<br />
Dein Macro Fusion sagt, daß test lieber zu nehmen ist als cmp. Ist hier eh der Fall. Und nur kurzzeitwissen, bis Intel cmp nachgerüstet hat, nehme ich an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888180</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 25 Apr 2010 17:37:13 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte If-Abfragen oder doch abbrechen? on Sun, 25 Apr 2010 20:36:00 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>... Dein Macro Fusion sagt, daß test lieber zu nehmen ist als cmp. Ist hier eh der Fall....</p>
</blockquote>
<p>Ich habe jetzt echt eine Weile gebraucht, um zu kapieren, warum der Compiler in deinem Testprogramm <strong>test</strong> mit <strong>jle</strong> verwendet... Eigentlich trivial, es liegt ja an den Bedingungen, einmal (x &lt; 1) und einmal (x &gt; 0). In diesem Fall kann man ja <strong>test</strong> verwenden, sozusagen mit Null vergleichen, und dann <strong>jle</strong> für kleiner gleich Null Abfrage. Laut Intel-Doku funktioniert Macro-fusion bei <strong>test</strong> mit allen bedingten Sprüngen. Das ist ok.<br />
Ändert man aber in der Funktion die Bedingungen, z.B. einmal (x &lt; 2) und einmal (x &gt; 1), muss der Compiler <strong>cmp</strong> generieren:</p>
<pre><code class="language-asm">080486c0 &lt;bla()&gt;:
 80486c0:	55                   	push   %ebp
 80486c1:	89 e5                	mov    %esp,%ebp
 80486c3:	83 ec 18             	sub    $0x18,%esp
 80486c6:	83 3d d4 a0 04 08 01 	cmpl   $0x1,0x804a0d4
 80486cd:	7e 1c                	jle    80486eb &lt;bla()+0x2b&gt;
 80486cf:	c7 44 24 08 07 00 00 	movl   $0x7,0x8(%esp)
 80486d6:	00 
 80486d7:	c7 44 24 04 3c 89 04 	movl   $0x804893c,0x4(%esp)
 80486de:	08 
 80486df:	c7 04 24 40 a0 04 08 	movl   $0x804a040,(%esp)
 80486e6:	e8 c9 fe ff ff       	call   80485b4 &lt;std::basic_ostream&lt;char, std::char_traits&lt;char&gt; &gt;&amp; std::__ostream_insert&lt;char, std::char_traits&lt;char&gt; &gt;(std::basic_ostream&lt;char, std::char_traits&lt;char&gt; &gt;&amp;, char const*, int)@plt&gt;
 80486eb:	c9                   	leave  
 80486ec:	c3                   	ret
</code></pre>
<p>Folge: keine Macro-fusion, wegen <strong>int x</strong> <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>
<p>Mit unsigned Version:</p>
<pre><code class="language-asm">80486c0 &lt;bla()&gt;:
 80486c0:	55                   	push   %ebp
 80486c1:	89 e5                	mov    %esp,%ebp
 80486c3:	83 ec 18             	sub    $0x18,%esp
 80486c6:	83 3d d4 a0 04 08 01 	cmpl   $0x1,0x804a0d4
 80486cd:	76 1c                	jbe    80486eb &lt;bla()+0x2b&gt;
 80486cf:	c7 44 24 08 07 00 00 	movl   $0x7,0x8(%esp)
 80486d6:	00 
 80486d7:	c7 44 24 04 bc 88 04 	movl   $0x80488bc,0x4(%esp)
 80486de:	08 
 80486df:	c7 04 24 40 a0 04 08 	movl   $0x804a040,(%esp)
 80486e6:	e8 d5 fe ff ff       	call   80485c0 &lt;std::basic_ostream&lt;char, std::char_traits&lt;char&gt; &gt;&amp; std::__ostream_insert&lt;char, std::char_traits&lt;char&gt; &gt;(std::basic_ostream&lt;char, std::char_traits&lt;char&gt; &gt;&amp;, char const*, int)@plt&gt;
 80486eb:	c9                   	leave  
 80486ec:	c3                   	ret    
 80486ed:	8d 76 00             	lea    0x0(%esi),%esi
</code></pre>
<p>Also <strong>cmp</strong> mit <strong>jbe</strong>, also Macro-fusion <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/1888248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888248</guid><dc:creator><![CDATA[abc.w]]></dc:creator><pubDate>Sun, 25 Apr 2010 20:36:00 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte If-Abfragen oder doch abbrechen? on Sun, 25 Apr 2010 20:49:01 GMT]]></title><description><![CDATA[<p>abc.w schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Danke für die feine Erklärung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1888251</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1888251</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 25 Apr 2010 20:49:01 GMT</pubDate></item></channel></rss>