<?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[if-else langsamer als switch]]></title><description><![CDATA[<p>Hallo,</p>
<p>heute habe ich eine etwas allgemeinere Frage. Ich schreibe gerade an einer Regelung und mir ist aufgefallen, dass if-else-Konstruktionen um Größenordnungen langsamer als switch Anweisungen sind.</p>
<p>Warum ist das so und wie stark unterscheidet sich die Geschwindigkeit?</p>
<p>Grüße</p>
<p>DipplInsch</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/186475/if-else-langsamer-als-switch</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 10:20:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/186475.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 09 Jul 2007 12:29:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to if-else langsamer als switch on Mon, 09 Jul 2007 12:29:21 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>heute habe ich eine etwas allgemeinere Frage. Ich schreibe gerade an einer Regelung und mir ist aufgefallen, dass if-else-Konstruktionen um Größenordnungen langsamer als switch Anweisungen sind.</p>
<p>Warum ist das so und wie stark unterscheidet sich die Geschwindigkeit?</p>
<p>Grüße</p>
<p>DipplInsch</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1321483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321483</guid><dc:creator><![CDATA[DipplInsch]]></dc:creator><pubDate>Mon, 09 Jul 2007 12:29:21 GMT</pubDate></item><item><title><![CDATA[Reply to if-else langsamer als switch on Mon, 09 Jul 2007 12:36:10 GMT]]></title><description><![CDATA[<p>Bei einer if-else-Kaskade müssen alle Bedingungen ausgewertet werden, bis du bei der richtigen ankommst - bei switch brauchst du nur eine Adresse aus der Sprungtabelle raussuchen und findest dort den korrekten Anweisungsblock. (das ist auch der Grund, warum für switch nur integrale Typen erlaubt sind)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1321490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321490</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 09 Jul 2007 12:36:10 GMT</pubDate></item><item><title><![CDATA[Reply to if-else langsamer als switch on Mon, 09 Jul 2007 12:45:04 GMT]]></title><description><![CDATA[<p>Dann hätte ich mal ne weitere Frage. Wie könnte man diesem Code schneller machen. Er wird 14 mal aufgerufen wobei ic bei null startet und bei jedem Durchlauf um eine Stelle erhöht wird.</p>
<pre><code class="language-cpp">if(ic &lt;= 12)
		{
//Wenige Berechnungen die oft ausgeführt werden
		}
else if(ic &gt;= 13)
		{
//Berechnungen die nur einmal ausgeführt werden
		}
else{
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1321501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321501</guid><dc:creator><![CDATA[DipplInsch]]></dc:creator><pubDate>Mon, 09 Jul 2007 12:45:04 GMT</pubDate></item><item><title><![CDATA[Reply to if-else langsamer als switch on Mon, 09 Jul 2007 12:50:19 GMT]]></title><description><![CDATA[<p>Du könntest die Schleife in zwei Teile aufteilen:</p>
<pre><code class="language-cpp">for(ic=0;ic&lt;13;++ic)
  //Wenige Berechnungen die oft ausgeführt werden
ic=13;
//Berechnungen die nur einmal ausgeführt werden
</code></pre>
<p>(btw, die zweite if()-Abfrage ist sowieso redundant)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1321503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321503</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 09 Jul 2007 12:50:19 GMT</pubDate></item><item><title><![CDATA[Reply to if-else langsamer als switch on Mon, 09 Jul 2007 12:57:37 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>bei switch brauchst du nur eine Adresse aus der Sprungtabelle raussuchen und findest dort den korrekten Anweisungsblock.</p>
</blockquote>
<p>Was aber nur geht, wenn die case werte es zulassen, dass mann eine Sprungtabelle aufbauen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1321506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321506</guid><dc:creator><![CDATA[103% Leistung]]></dc:creator><pubDate>Mon, 09 Jul 2007 12:57:37 GMT</pubDate></item><item><title><![CDATA[Reply to if-else langsamer als switch on Mon, 09 Jul 2007 12:58:08 GMT]]></title><description><![CDATA[<p>Es handelt sich um einer Interrupt-&quot;schleife&quot;. Die if-else-Anweisung wird abhängig von einem äußeren Takt ausgeführt und je nachdem wie der Schleifenzähler steht, wird die richtige &quot;Abzweigung&quot; gewählt.</p>
<p>Zur Info:</p>
<p>Hier wird über eine SSI-Schnittstelle ein Winkel eingelesen. Der Sensor liefert bei jedem Takt die nächste Stelle der Zahl. Es kommen also 13 mal NULLEN oder EINSEN die abgespeichert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1321507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321507</guid><dc:creator><![CDATA[DipplInsch]]></dc:creator><pubDate>Mon, 09 Jul 2007 12:58:08 GMT</pubDate></item><item><title><![CDATA[Reply to if-else langsamer als switch on Mon, 09 Jul 2007 13:07:34 GMT]]></title><description><![CDATA[<p>hab noch eine Idee, if-else zu vermeiden, weiß aber nicht, ob das trotz der Division einen Geschwindigkeitsvorteil bringt:</p>
<pre><code class="language-cpp">switch (ic/13)
  {
  case 0: break;//&lt;=12
  case 1: break;//&gt;=13
  }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1321514</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321514</guid><dc:creator><![CDATA[Morris Szyslak]]></dc:creator><pubDate>Mon, 09 Jul 2007 13:07:34 GMT</pubDate></item><item><title><![CDATA[Reply to if-else langsamer als switch on Mon, 09 Jul 2007 13:21:52 GMT]]></title><description><![CDATA[<p>Morris Szyslak schrieb:</p>
<blockquote>
<p>hab noch eine Idee, if-else zu vermeiden, weiß aber nicht, ob das trotz der Division einen Geschwindigkeitsvorteil bringt:</p>
<pre><code class="language-cpp">switch (ic/13)
  {
  case 0: break;//&lt;=12
  case 1: break;//&gt;=13
  }
</code></pre>
</blockquote>
<p>was is bei ic = 30?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1321531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321531</guid><dc:creator><![CDATA[ähn nö]]></dc:creator><pubDate>Mon, 09 Jul 2007 13:21:52 GMT</pubDate></item><item><title><![CDATA[Reply to if-else langsamer als switch on Mon, 09 Jul 2007 13:26:12 GMT]]></title><description><![CDATA[<p>103% Leistung schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>bei switch brauchst du nur eine Adresse aus der Sprungtabelle raussuchen und findest dort den korrekten Anweisungsblock.</p>
</blockquote>
<p>Was aber nur geht, wenn die case werte es zulassen, dass mann eine Sprungtabelle aufbauen kann.</p>
</blockquote>
<p>Du kannst dem Compiler schon vertrauen, daß er das bei einem standardkonformen switch() auch hinbekommt <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>
<p>@DipplInsch: Du mußt nicht unbedingt jedes if() rausschmeißen wollen - und für so eine Zwei-Wege-Auswahl macht es noch keinen großen Unterschied zwischen if und switch (wie gesagt, das zweite if ist redundant).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1321536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321536</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 09 Jul 2007 13:26:12 GMT</pubDate></item><item><title><![CDATA[Reply to if-else langsamer als switch on Mon, 09 Jul 2007 13:41:13 GMT]]></title><description><![CDATA[<p>DipplInsch schrieb:</p>
<blockquote>
<p>Ich schreibe gerade an einer Regelung und mir ist aufgefallen, dass if-else-Konstruktionen um Größenordnungen langsamer als switch Anweisungen sind.</p>
</blockquote>
<p>Mit solchen Aussagen sollte man vorsichtig sein, da sie nicht allgemein gültig sind. Was schneller ist, hänt sehr stark von der Anzahl der Zweige ab. Auch Platform, Compiler und Optimierungseinstellungen spielen eine große Rolle.</p>
<blockquote>
<p>Bei einer if-else-Kaskade müssen alle Bedingungen ausgewertet werden, bis du bei der richtigen ankommst - bei switch brauchst du nur eine Adresse aus der Sprungtabelle raussuchen und findest dort den korrekten Anweisungsblock.</p>
</blockquote>
<p>Das hört sich erstmal nach einem klaren Vorteil für switch an. Dank Branch-Prediction, Speculative Execution usw. kann das Pendel aber auch durchaus mal in Richtung if-else ausschlagen.</p>
<p>Wie immer gilt: im Zweifelsfall messen, nicht raten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1321545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321545</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Mon, 09 Jul 2007 13:41:13 GMT</pubDate></item><item><title><![CDATA[Reply to if-else langsamer als switch on Mon, 09 Jul 2007 13:59:15 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>(wie gesagt, das zweite if ist redundant).</p>
</blockquote>
<p>Wieso ist das redundant?</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1321563</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321563</guid><dc:creator><![CDATA[DipplInsch]]></dc:creator><pubDate>Mon, 09 Jul 2007 13:59:15 GMT</pubDate></item><item><title><![CDATA[Reply to if-else langsamer als switch on Mon, 09 Jul 2007 14:03:50 GMT]]></title><description><![CDATA[<p>DipplInsch schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>(wie gesagt, das zweite if ist redundant).</p>
</blockquote>
<p>Wieso ist das redundant?</p>
</blockquote>
<p>Wenn der Test auf ic&lt;=12 fehlgeschlagen ist, ist ic&gt;=13 in jedem Fall erfüllt <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="😉"
    /> (außer du hantierst mit Gleitkommawerten)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1321566</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321566</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 09 Jul 2007 14:03:50 GMT</pubDate></item><item><title><![CDATA[Reply to if-else langsamer als switch on Mon, 09 Jul 2007 14:04:55 GMT]]></title><description><![CDATA[<p>Tschuldigung für den Doppelbeitrag aber wo wir gerade dabei sind. Wie soll man das messen?</p>
<p>HumeSikkins schrieb:</p>
<blockquote>
<p>Wie immer gilt: im Zweifelsfall messen, nicht raten.</p>
</blockquote>
<p>Ausserdem war das kein Raten sondern eine Schlussfolgerung aufgrund des Programmverhaltens. <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>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1321568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321568</guid><dc:creator><![CDATA[DipplInsch]]></dc:creator><pubDate>Mon, 09 Jul 2007 14:04:55 GMT</pubDate></item><item><title><![CDATA[Reply to if-else langsamer als switch on Mon, 09 Jul 2007 14:08:54 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>103% Leistung schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>bei switch brauchst du nur eine Adresse aus der Sprungtabelle raussuchen und findest dort den korrekten Anweisungsblock.</p>
</blockquote>
<p>Was aber nur geht, wenn die case werte es zulassen, dass mann eine Sprungtabelle aufbauen kann.</p>
</blockquote>
<p>Du kannst dem Compiler schon vertrauen, daß er das bei einem standardkonformen switch() auch hinbekommt <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>
</blockquote>
<pre><code class="language-cpp">switch(a)
    {
    case 1:
        break;
    case 253:
        break;
    case 333:
        break;
    case 1444:
        break;
    case 5555:
        break;
    case 6643:
        break;
    case 11227:
        break;
    case 23458:
        break;
    case 23559:
        break;
    case 25550:
        break;
    }
</code></pre>
<p>Wie sieht jetzt die Tabelle aus? Soll die 25550 Einträge haben von denen fast alle leer sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1321573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321573</guid><dc:creator><![CDATA[103% Leistung]]></dc:creator><pubDate>Mon, 09 Jul 2007 14:08:54 GMT</pubDate></item><item><title><![CDATA[Reply to if-else langsamer als switch on Mon, 09 Jul 2007 14:43:08 GMT]]></title><description><![CDATA[<p>Mit einer perfekten Hashfunktion ging das schon theoretisch, die Frage ist, ob Compiler sowas machen <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/1321609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321609</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Mon, 09 Jul 2007 14:43:08 GMT</pubDate></item><item><title><![CDATA[Reply to if-else langsamer als switch on Mon, 09 Jul 2007 15:38:51 GMT]]></title><description><![CDATA[<p>Compiler sind bei if UND switch üblicherweise recht doof, weil sie nicht wissen können für welchen Fall sie optimieren sollen.<br />
Und &quot;alles wird schneller&quot; Optimierungen (z.B. eben Jumptable ohne vorherigen Rangecheck o.ä.) sind oft nicht möglich bzw. ist es oft schwierig für den Compiler zu erkennen dass sie (problemlos/gefahrlos) möglich sind.</p>
<p>Was bei einigen Anwendungen möglich ist: lookup Tables verwenden.<br />
z.B. kann man ein Clamping eines unsigned ints auf 0-255 ohne &quot;if&quot; durchführen, z.B. so:</p>
<pre><code class="language-cpp">unsigned int x = ...;
// clamp:
unsigned int const lut[2] = {0, 0xff};
x |= lut[(x &amp; 0x7fffff00) != 0];
x &amp;= 0xff;
</code></pre>
<p>Das &quot;(x &amp; 0x7fffff00) != 0&quot; sieht zwar wie ein verstecktes &quot;if&quot; aus, da es aber direkt in einen Index umgewandelt wird können manche Compiler intern ein billiges &quot;conditional set&quot; oder &quot;conditional move&quot; draus machen statt einem teuren &quot;conditional jump&quot;.</p>
<p>Genauso könnte man diese Technik u.U. verwenden wenn man je nach Bedingung einen von 2 ganz unterschiedlichen Werten auswählen möchte. Wenn das &quot;if&quot; mehr weh tut als beide Werte zu berechnen (d.h. einen zu berechnen obwohl man ihn garnicht braucht) bringt das auch was.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1321655</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321655</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 09 Jul 2007 15:38:51 GMT</pubDate></item><item><title><![CDATA[Reply to if-else langsamer als switch on Mon, 09 Jul 2007 15:47:49 GMT]]></title><description><![CDATA[<p>103% Leistung schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>103% Leistung schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>bei switch brauchst du nur eine Adresse aus der Sprungtabelle raussuchen und findest dort den korrekten Anweisungsblock.</p>
</blockquote>
<p>Was aber nur geht, wenn die case werte es zulassen, dass mann eine Sprungtabelle aufbauen kann.</p>
</blockquote>
<p>Du kannst dem Compiler schon vertrauen, daß er das bei einem standardkonformen switch() auch hinbekommt <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>
</blockquote>
<pre><code class="language-cpp">switch(a)
    {
    case 1:
        break;
    case 253:
        break;
    case 333:
        break;
    case 1444:
        break;
    case 5555:
        break;
    case 6643:
        break;
    case 11227:
        break;
    case 23458:
        break;
    case 23559:
        break;
    case 25550:
        break;
    }
</code></pre>
<p>Wie sieht jetzt die Tabelle aus? Soll die 25550 Einträge haben von denen fast alle leer sind.</p>
</blockquote>
<p>Das implementiert der Compiler als binary search tree und blöcke die fortlaufend sind, kann er dann wieder als tabellen implementieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1321660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321660</guid><dc:creator><![CDATA[lolz]]></dc:creator><pubDate>Mon, 09 Jul 2007 15:47:49 GMT</pubDate></item></channel></rss>