<?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[Welche Abfrage ist schneller?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe da eine kleine Frage and die Experten. Ich stelle sie nur aus Neugier.<br />
Welche Abfrage ist im folgenden Fall schneller:</p>
<p>Gegeben sei die Zahl x im Bereich [0, Integer-Maximum] (oder ist Integer-Maximum nicht im Bereich enthalten? Also [0, Integer-Maximum[ )<br />
Also x ist ein unsigned int.</p>
<p>Hier zwei Abfragen - Welche ist performanter/schneller:</p>
<pre><code>if(x &lt; 2){
...
}

if(x == 0 || x == 1){ //aus Versehen &amp;&amp;. Naja
...
}
</code></pre>
<p>Danke für eure Hilfe im Voraus</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/320953/welche-abfrage-ist-schneller</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 14:06:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/320953.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 18 Oct 2013 09:54:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Welche Abfrage ist schneller? on Fri, 18 Oct 2013 10:02:43 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe da eine kleine Frage and die Experten. Ich stelle sie nur aus Neugier.<br />
Welche Abfrage ist im folgenden Fall schneller:</p>
<p>Gegeben sei die Zahl x im Bereich [0, Integer-Maximum] (oder ist Integer-Maximum nicht im Bereich enthalten? Also [0, Integer-Maximum[ )<br />
Also x ist ein unsigned int.</p>
<p>Hier zwei Abfragen - Welche ist performanter/schneller:</p>
<pre><code>if(x &lt; 2){
...
}

if(x == 0 || x == 1){ //aus Versehen &amp;&amp;. Naja
...
}
</code></pre>
<p>Danke für eure Hilfe im Voraus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361111</guid><dc:creator><![CDATA[kralo9]]></dc:creator><pubDate>Fri, 18 Oct 2013 10:02:43 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Abfrage ist schneller? on Fri, 18 Oct 2013 10:01:56 GMT]]></title><description><![CDATA[<p>Die zweite ist Unsinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361114</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361114</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Fri, 18 Oct 2013 10:01:56 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Abfrage ist schneller? on Fri, 18 Oct 2013 10:03:07 GMT]]></title><description><![CDATA[<p>Die zweite Abfrage ist sinnlos. Die Frage kann man so pauschal nicht beantworten, das hängt von vielen, vielen Dingen ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361115</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361115</guid><dc:creator><![CDATA[raute]]></dc:creator><pubDate>Fri, 18 Oct 2013 10:03:07 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Abfrage ist schneller? on Fri, 18 Oct 2013 10:03:12 GMT]]></title><description><![CDATA[<p>Caligulaminus schrieb:</p>
<blockquote>
<p>Die zweite ist Unsinn.</p>
</blockquote>
<p>Hoppla, sollte || sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361116</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361116</guid><dc:creator><![CDATA[kralo9]]></dc:creator><pubDate>Fri, 18 Oct 2013 10:03:12 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Abfrage ist schneller? on Fri, 18 Oct 2013 10:04:23 GMT]]></title><description><![CDATA[<p>Die zweite, denn die kann der Compiler zu <code>if(false)</code> optimieren. <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>Falls du <code>if(x == 0 || x == 1)</code> meinen solltest: Im Zweifelsfall ausprobieren, mit realen Daten. Vergleiche auf 0 können minimal schneller sein als andere. Wenn nun sehr oft 0 vorkommt, kann dies <em>eventuell</em> die erhöhte Codekomplexität ausgleichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361117</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 18 Oct 2013 10:04:23 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Abfrage ist schneller? on Fri, 18 Oct 2013 10:35:30 GMT]]></title><description><![CDATA[<p>Wenn die beiden Bedingungen äquivalent sind, und das scheint bei unsiged der Fall zu sein, wird dir da jeder halbwegs aktuelle Compiler den selben optimalen Maschinencode draus erzeugen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361126</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Fri, 18 Oct 2013 10:35:30 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Abfrage ist schneller? on Fri, 18 Oct 2013 10:48:26 GMT]]></title><description><![CDATA[<p>TNA schrieb:</p>
<blockquote>
<p>Wenn die beiden Bedingungen äquivalent sind, und das scheint bei unsiged der Fall zu sein, wird dir da jeder halbwegs aktuelle Compiler den selben optimalen Maschinencode draus erzeugen.</p>
</blockquote>
<p>Bezweifle ich. Dies ist keine triviale Umformung wie von Division zu Shiftoperator, sondern eine Mikrooptimierung deren Wirksamkeit oder Unwirksamkeit (oder gar Schädlichkeit) entscheidend von vielen Details abhängt, die der Compiler nicht kennen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361129</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 18 Oct 2013 10:48:26 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Abfrage ist schneller? on Fri, 18 Oct 2013 11:05:57 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>TNA schrieb:</p>
<blockquote>
<p>Wenn die beiden Bedingungen äquivalent sind, und das scheint bei unsiged der Fall zu sein, wird dir da jeder halbwegs aktuelle Compiler den selben optimalen Maschinencode draus erzeugen.</p>
</blockquote>
<p>Bezweifle ich. Dies ist keine triviale Umformung wie von Division zu Shiftoperator, sondern eine Mikrooptimierung deren Wirksamkeit oder Unwirksamkeit (oder gar Schädlichkeit) entscheidend von vielen Details abhängt, die der Compiler nicht kennen kann.</p>
</blockquote>
<p>Also meiner Erfahrung nach optimieren Compiler sehr viel komplexere Sachen insbesondere bei Logik ausdrücken. x &lt; 2 sollte auch bei allen mir bekannten Architekturen mit einem Maschinenbefehl abbildbar sein. was soll man da noch besser machen können?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361135</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Fri, 18 Oct 2013 11:05:57 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Abfrage ist schneller? on Fri, 18 Oct 2013 11:51:47 GMT]]></title><description><![CDATA[<p>TNA schrieb:</p>
<blockquote>
<p>Also meiner Erfahrung nach optimieren Compiler sehr viel komplexere Sachen insbesondere bei Logik ausdrücken. x &lt; 2 sollte auch bei allen mir bekannten Architekturen mit einem Maschinenbefehl abbildbar sein. was soll man da noch besser machen können?</p>
</blockquote>
<p>Tatsache. Der GCC 4.8 macht beides zu einem Vergleich auf &lt; 2. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>edit: Bei genaueren Tests kommt es auch noch da drauf an, wie die Schleife genau abgerollt wird. Manchmal kommt dann &lt; 2, manchmal &gt; 1.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361141</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 18 Oct 2013 11:51:47 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Abfrage ist schneller? on Fri, 18 Oct 2013 11:39:06 GMT]]></title><description><![CDATA[<p>Mein SV11 macht daraus <code>&gt;=2</code> und <code>&gt;1</code> .</p>
<pre><code>000000013F91170C  cmp         eax,2  
000000013F91170F  jae         main+36h (013F911716h)
</code></pre>
<p>vs.</p>
<pre><code>000000013F91172D  cmp         eax,1  
000000013F911730  ja          main+57h (013F911737h)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2361148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361148</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Fri, 18 Oct 2013 11:39:06 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Abfrage ist schneller? on Fri, 18 Oct 2013 12:01:54 GMT]]></title><description><![CDATA[<p>Hm. Wenn der Compiler aus beiden Abfragen das selbe optimiert, ist es egal. Fast. Natürlich ist x &lt; 2 besser, da weniger komplex.</p>
<p>Ich dachte eigentlich daran, ob die eine Abfrage mehr Taktzyklen beansprucht als die andere, ohne Optimierung des Compilers. Also so wie es da steht direkt als Assembler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361160</guid><dc:creator><![CDATA[kralo9]]></dc:creator><pubDate>Fri, 18 Oct 2013 12:01:54 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Abfrage ist schneller? on Fri, 18 Oct 2013 12:23:23 GMT]]></title><description><![CDATA[<p>kralo9 schrieb:</p>
<blockquote>
<p>Ich dachte eigentlich daran, ob die eine Abfrage mehr Taktzyklen beansprucht als die andere, ohne Optimierung des Compilers. Also so wie es da steht direkt als Assembler.</p>
</blockquote>
<p>Unwahrscheinlich dass das zweite schneller ist, aber theoretisch vorstellbar. Wird, wie schon gesagt, stark von den Eingabedaten abhängen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361170</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 18 Oct 2013 12:23:23 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Abfrage ist schneller? on Fri, 18 Oct 2013 12:45:20 GMT]]></title><description><![CDATA[<p>kralo9 schrieb:</p>
<blockquote>
<p>Also so wie es da steht direkt als Assembler.</p>
</blockquote>
<p>Kommt natürlich auf die Architektur an. In der Regel sind alle Vergleisoperationen gleich schnell und die zweite Variante würde bei einer 1:1 Abbildung mindestens zwei statt einem benötigen, wovon der zweite aber je nach Fall ausgelassen werden könnte. Also je nach Eingabedaten bestenfalls gleichschnell.</p>
<p>Die Lehre aus diesem Fall ist aber ohnehin: Schreib verständlichen, problemnahen Code und las den Compiler machen. Der weiß im Zweifelsfall besser als du (und ich), was schneller ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361176</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Fri, 18 Oct 2013 12:45:20 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Abfrage ist schneller? on Fri, 18 Oct 2013 15:15:53 GMT]]></title><description><![CDATA[<p>Weil wir grad dabei sind...</p>
<p>Was ist schneller, ein &quot;branch taken&quot; oder ein &quot;branch not taken&quot;?<br />
Also sollte man bedingte Sprungbefehle so schreiben dass meistens gesprungen wird, oder so dass meistens nicht gesprungen wird?</p>
<p>Wenn die Branch-Prediction richtig tippt würde ich annehmen dass &quot;nicht gesprungen&quot; schneller sein müsste -- weil die ganze Pipeline dabei ohne Änderung weitermachen kann. D.h. wenn es in dem Fall überhaupt einen Unterschied macht.</p>
<p>Aber trifft das auch zu wenn die Branch-Prediction den Sprungbefehl noch nicht kennt?<br />
Gibt es da ne Richtwert der bei den meisten CPUs passt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361203</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361203</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 18 Oct 2013 15:15:53 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Abfrage ist schneller? on Fri, 18 Oct 2013 16:06:07 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Aber trifft das auch zu wenn die Branch-Prediction den Sprungbefehl noch nicht kennt?</p>
</blockquote>
<p>Andererseits ist diese Mikro-Optimierung gerade an dieser Stelle dann mit großer Wahrscheinlichkeit auch irrelevant.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361212</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Fri, 18 Oct 2013 16:06:07 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Abfrage ist schneller? on Fri, 18 Oct 2013 17:57:00 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Weil wir grad dabei sind...</p>
<p>Was ist schneller, ein &quot;branch taken&quot; oder ein &quot;branch not taken&quot;?<br />
Also sollte man bedingte Sprungbefehle so schreiben dass meistens gesprungen wird, oder so dass meistens nicht gesprungen wird?</p>
<p>Wenn die Branch-Prediction richtig tippt würde ich annehmen dass &quot;nicht gesprungen&quot; schneller sein müsste -- weil die ganze Pipeline dabei ohne Änderung weitermachen kann. D.h. wenn es in dem Fall überhaupt einen Unterschied macht.</p>
<p>Aber trifft das auch zu wenn die Branch-Prediction den Sprungbefehl noch nicht kennt?<br />
Gibt es da ne Richtwert der bei den meisten CPUs passt?</p>
</blockquote>
<p>Das ist ein komplexes Thema. Zuerst muss man hier zwischen &quot;Branch taken&quot; im C++ Code und im daraus generierten Maschienencode unterscheiden. Das muss nämlich nicht identisch sein. Der Compiler kann das in der Regel umdrehen, wenn er es für sinnvoll hält. Auf Maschienenebene ist es meistens so, dass beim ersten Durchlauf, also praktisch immer außerhalb von Schleifen, vom &quot;Branch not taken&quot; Fall ausgegangen wird. Es gibt aber Architekturen wie z.B. beim PowerPC bei dem man in den Branchinstruktionen angeben kann, welcher Fall warscheilicher ist. Dafür muss der Compiler natürlich entscheiden, welchen Fall er für warscheinlicher hält. Compiler haben aber darüber hinaus oft noch Möglichkeiten schon auf höherer, maschinenunabhängiger Ebene, Optimierung zu machen, die einen der beiden Pfade bevorzugen. Oft kann der Compiler schon recht gut aus dem Programm erkennen, Welcher Pfad wahrscheinlicher ist. Manchmal allerdings auch nicht. Bei GCC schein es tatsächlich so zu sein, das er zumindest bei if ohne Else, den if-Fall für unwarscheinlicher hält. Aber auch dem kann man das mit __builtin_expect vorschreiben, wenn man sich für schlauer als der Compiler hält.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361228</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Fri, 18 Oct 2013 17:57:00 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Abfrage ist schneller? on Fri, 18 Oct 2013 18:24:11 GMT]]></title><description><![CDATA[<p>Wenn ich mich recht erinnere, ist es egal.<br />
Der Prosessor macht seine Sprungvorhersage und lädt den laut Sprungvorherage nächsten Befehl in die Pipeline, egal ob der direkt dem JMP folgt oder woanders steht, fürs Woandersgucken hat er genug Zeit.</p>
<p>Optimieren kann man in kleinen Schleifen nur fürs erste Auftauchen, wenn die Sprungvorhersagetabelle noch leer ist. Und natürlich für selten laufenden Code, da ist sie immer wieder leer.</p>
<p>Wenn ich mich recht erinnere, ist die Defaultbelegung der Sprungvorhersage dann:<br />
Sprünge nach unten werden als unwahrscheinlich angenommen, also typischerweise der überspringbare if-zweig bevorzugt.<br />
Sprünge nach oben werden als Wahrscheinlich angenommen, also typischerweise die bedingte Schleifenwiederholung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361238</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 18 Oct 2013 18:24:11 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Abfrage ist schneller? on Fri, 18 Oct 2013 20:58:48 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/30768">@TNA</a><br />
Ja, mir ist klar dass der &quot;if&quot; Zweig in C++ nicht unbedingt zum &quot;branch taken&quot; in Assembler wird. Und auch nicht umgekehrt. Sondern so wie der Compiler meint dass es schlau ist.</p>
<p>Die Möglichkeit anzugeben was man für wahrscheinlicher hält ist natürlich Top. Das macht Sinn. Dumm nur dass die momentan interessanteste Architektur (=x64) es nicht kann.</p>
<p>@all<br />
Mir ist auch klar dass die Unterschiede vermutlich nicht SO krass reinhauen werden. Mich interessiert das rein &quot;akademisch&quot; <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="🙂"
    /><br />
(Ich würde nie im Traum daran denken bei sowas von Hand zu optmieren anzufangen.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361274</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 18 Oct 2013 20:58:48 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Abfrage ist schneller? on Fri, 18 Oct 2013 21:06:13 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Die Möglichkeit anzugeben was man für wahrscheinlicher hält ist natürlich Top. Das macht Sinn. Dumm nur dass die momentan interessanteste Architektur (=x64) es nicht kann.</p>
</blockquote>
<p>Quelle?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361277</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361277</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 18 Oct 2013 21:06:13 GMT</pubDate></item></channel></rss>