<?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[Böses Microoptimieren! (Bedingungen)]]></title><description><![CDATA[<p>Hallo,<br />
ich habe mal gelesen, dass switch/case effizienteren Code erlaubt, wenn die cases einen Zusammenhängenden Bereich abdecken, weil dann Jump Tables erzeugt werden können</p>
<pre><code class="language-cpp">char a;
switch(a)
{
    case 'a': return 1; break;
    case 'b': return 2; break;
    case 'c': return 3; break;
}
</code></pre>
<p>Die oben stehende switch/case Anweisung wäre ja dann einem if/else vorzuziehen.<br />
Wie sieht es mit einem solchen Konstrukt aus:</p>
<pre><code class="language-cpp">char a;
switch(a)
{
    case 'a':
    case 'A': return 1; break;
    case 'b':
    case 'B': return 2; break;
    case 'c':
    case 'C': return 3; break;
}

//oder besser das?
char a;
switch(a)
{
    case 'a': return 1; break;
    case 'b': return 2; break;
    case 'c': return 3; break;

    case 'A': return 1; break;
    case 'B': return 2; break;
    case 'C': return 3; break;
}
</code></pre>
<p>Und wie sieht es mit dem Ternären Operator aus? Ich habe mal gelesen, dass der Ternäre Operator immer switch/case und if/else vorzuziehen ist, weil er dem Compiler erlaubt, performanteren Code zu erzeugen. Ist da was dran?</p>
<p>Und bitte kein geflame</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/253533/böses-microoptimieren-bedingungen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 13 Sep 2026 16:48:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/253533.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 03 Nov 2009 19:19:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Böses Microoptimieren! (Bedingungen) on Tue, 03 Nov 2009 19:19:57 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe mal gelesen, dass switch/case effizienteren Code erlaubt, wenn die cases einen Zusammenhängenden Bereich abdecken, weil dann Jump Tables erzeugt werden können</p>
<pre><code class="language-cpp">char a;
switch(a)
{
    case 'a': return 1; break;
    case 'b': return 2; break;
    case 'c': return 3; break;
}
</code></pre>
<p>Die oben stehende switch/case Anweisung wäre ja dann einem if/else vorzuziehen.<br />
Wie sieht es mit einem solchen Konstrukt aus:</p>
<pre><code class="language-cpp">char a;
switch(a)
{
    case 'a':
    case 'A': return 1; break;
    case 'b':
    case 'B': return 2; break;
    case 'c':
    case 'C': return 3; break;
}

//oder besser das?
char a;
switch(a)
{
    case 'a': return 1; break;
    case 'b': return 2; break;
    case 'c': return 3; break;

    case 'A': return 1; break;
    case 'B': return 2; break;
    case 'C': return 3; break;
}
</code></pre>
<p>Und wie sieht es mit dem Ternären Operator aus? Ich habe mal gelesen, dass der Ternäre Operator immer switch/case und if/else vorzuziehen ist, weil er dem Compiler erlaubt, performanteren Code zu erzeugen. Ist da was dran?</p>
<p>Und bitte kein geflame</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802849</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802849</guid><dc:creator><![CDATA[Optimiz0r]]></dc:creator><pubDate>Tue, 03 Nov 2009 19:19:57 GMT</pubDate></item><item><title><![CDATA[Reply to Böses Microoptimieren! (Bedingungen) on Tue, 03 Nov 2009 19:25:32 GMT]]></title><description><![CDATA[<p>Optimiz0r schrieb:</p>
<blockquote>
<p>Ich habe mal gelesen, dass der Ternäre Operator immer switch/case und if/else vorzuziehen ist, weil er dem Compiler erlaubt, performanteren Code zu erzeugen. Ist da was dran?</p>
</blockquote>
<p>Nein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802855</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802855</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 03 Nov 2009 19:25:32 GMT</pubDate></item><item><title><![CDATA[Reply to Böses Microoptimieren! (Bedingungen) on Tue, 03 Nov 2009 19:27:32 GMT]]></title><description><![CDATA[<p>Optimiz0r schrieb:</p>
<blockquote>
<pre><code class="language-cpp">//oder besser das?
char a;
switch(a)
{
    case 'a': return 1; break;
    case 'b': return 2; break;
    case 'c': return 3; break;
    
    case 'A': return 1; break;
    case 'B': return 2; break;
    case 'C': return 3; break;
}
</code></pre>
<p>Und bitte kein geflame</p>
</blockquote>
<p>Vielleicht</p>
<pre><code class="language-cpp">char a;
switch(a)
{
    case 'a': return 1; break;
    case 'b': return 2; break;
    case 'c': return 3; break;
}
switch(a)
{    
    case 'A': return 1; break;
    case 'B': return 2; break;
    case 'C': return 3; break;
}
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">char a;
switch(to_lower(a))
{
    case 'a': return 1; break;
    case 'b': return 2; break;
    case 'c': return 3; break;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1802856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802856</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 03 Nov 2009 19:27:32 GMT</pubDate></item><item><title><![CDATA[Reply to Böses Microoptimieren! (Bedingungen) on Tue, 03 Nov 2009 21:40:35 GMT]]></title><description><![CDATA[<p>Warum hinter return ein break?<br />
Das sollte eigentlich zu nicht erreichbarem Code zählen oder nicht?<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802929</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Tue, 03 Nov 2009 21:40:35 GMT</pubDate></item><item><title><![CDATA[Reply to Böses Microoptimieren! (Bedingungen) on Tue, 03 Nov 2009 21:42:21 GMT]]></title><description><![CDATA[<p>Ja stimmt <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/1802930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802930</guid><dc:creator><![CDATA[Optimiz0r]]></dc:creator><pubDate>Tue, 03 Nov 2009 21:42:21 GMT</pubDate></item><item><title><![CDATA[Reply to Böses Microoptimieren! (Bedingungen) on Tue, 03 Nov 2009 22:33:06 GMT]]></title><description><![CDATA[<p>bevor du jz wieder an volkards sarkasmus scheiterst:</p>
<pre><code class="language-cpp">switch(a)
{
  case 'a':
  case 'A':
    return 1;
  case 'b':
  case 'B':
    return 2;
}
</code></pre>
<p>sollte die schnellste variante sein ;o) (aber auch hier gilt - wie immer bei solchen fragen - ganz genau kann dir das nur ein profiler zeigen - und dann auch nur für einen bestimmten compiler und eine bestimmte platform - und nicht zu letzt eine bestimmte config <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="😉"
    /> )<br />
ich weiß nur nicht, ob der compiler bei 'Z'-'A' == 26 das ganze zu ner addition(bzw subtraktion) optimieren kann.</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802954</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 03 Nov 2009 22:33:06 GMT</pubDate></item><item><title><![CDATA[Reply to Böses Microoptimieren! (Bedingungen) on Tue, 03 Nov 2009 23:10:38 GMT]]></title><description><![CDATA[<p>Was für C++ Code in welchen Assembler-Code übersetzt wird, ist total Compiler-abhängig.<br />
Damit erübrigt sich IMO auch schon jegliche Diskussion darüber welche &quot;Schreibweise&quot; für irgendwas &quot;schneller&quot; ist.</p>
<p>Was wirklich etwas bringen kann, sind Dinge wie __assume (<a href="http://msdn.microsoft.com/en-us/library/1b3fsfxw(VS.80).aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/1b3fsfxw(VS.80).aspx</a>), oder diverse Compiler-Intrinsics für MMX/SSE/SSE2/...</p>
<p>Und natürlich kann es nie schaden mal etwas an den Compiler-Optionen rumzuschrauben. Inlining für alle Funktionen erlauben, ggf. maximal erlaubte Inlining-Tiefe erhöhen und Link-Time-Code-Generation aktivieren kann z.B. Wunder wirken.</p>
<p>p.S.: natürlich gibt es auch noch profile-guided Optimization. Bringt zwar meistens keine Welten, aber 5% sind schnell mal drin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802959</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 03 Nov 2009 23:10:38 GMT</pubDate></item><item><title><![CDATA[Reply to Böses Microoptimieren! (Bedingungen) on Tue, 03 Nov 2009 23:14:15 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>bevor du jz wieder an volkards sarkasmus scheiterst:</p>
<pre><code class="language-cpp">switch(a)
{
  case 'a':
  case 'A':
    return 1;
  case 'b':
  case 'B':
    return 2;
}
</code></pre>
<p>sollte die schnellste variante sein ;o)</p>
</blockquote>
<p>noch schneller:</p>
<pre><code class="language-cpp">return a &amp; 3;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1802960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802960</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 03 Nov 2009 23:14:15 GMT</pubDate></item><item><title><![CDATA[Reply to Böses Microoptimieren! (Bedingungen) on Tue, 03 Nov 2009 23:19:14 GMT]]></title><description><![CDATA[<p>aber eben wieder nur für die annahme, dass 'z'-'a' == 26 == 'Z'-'A' und jetzt so gar noch für 'z' &amp; 3 == 'Z' &amp; 3 == 1<br />
mal davon abgesehen, dass so etwas nie der flaschenhals sein wird, kommts halt drauf an, für was man programmiert - wenns nur &quot;normale&quot; maschinen sind, dann kann man sich wohl auf ASCII verlassen(baut ggf. noch nen static assert ein)...<br />
(ich vertrau dir einfach mal, dass o.g. für ascii gilt^^)</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802963</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 03 Nov 2009 23:19:14 GMT</pubDate></item><item><title><![CDATA[Reply to Böses Microoptimieren! (Bedingungen) on Tue, 03 Nov 2009 23:26:56 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>bevor du jz wieder an volkards sarkasmus scheiterst:</p>
</blockquote>
<p>Hä? Welcher Sarkasmus denn? Ich gehe davon aus, daß es nicht darum geht, nur diese Zahl zu returnen, sondern anhand des Buchstabens unterschiedliche Sachen zu machen und daß Groß- und Kleinbuchstaben als gleich behandelt werden. Von assume gehe ich natürlich mal aus, wollte das nur nicht am Anfang zeigen. Und meine erste Version klingt danach, als könnte ziemlich jeder compiler das optimal übersetzen, ganz im Gegensatz zu den anderen Versionen mit großen Löchern in der Wertetabelle. Um das Riesenloch wegzumachen, spaltete ich ein Lochswitch in zwei gute switch auf. Und die zweite geht von inline int to_lower(int ch){return ch|64;} oder was ähnlich schnellem aus, womit dessen Einsatz zur Beschleunigung sehr wohl gerechtfertigt ist.</p>
<p>unskilled schrieb:</p>
<blockquote>
<p>sollte die schnellste variante sein</p>
</blockquote>
<p>Warum?</p>
<p>unskilled schrieb:</p>
<blockquote>
<p>ich weiß nur nicht, ob der compiler bei 'Z'-'A' == 26 das ganze zu ner addition(bzw subtraktion) optimieren kann.</p>
</blockquote>
<p>DAS wäre mal ein Grund für Sarkasmus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802964</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802964</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 03 Nov 2009 23:26:56 GMT</pubDate></item><item><title><![CDATA[Reply to Böses Microoptimieren! (Bedingungen) on Tue, 03 Nov 2009 23:22:53 GMT]]></title><description><![CDATA[<p>Nachdem in ASCII 'A'==0x41 und 'a'==0x61 ... ja, gilt das <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>Ansonsten:</p>
<pre><code class="language-cpp">#if defined(_MSC_VER) &amp;&amp; _MSC_VER &gt;= 1400
  #define OPTIMIZE_ASSUME(x) __assume(x)
#else
  #define OPTIMIZE_ASSUME(x) ((void)x)
#endif

// ...

switch(a)
{
  case 'a':
  case 'A':
    return 1;
  case 'b':
  case 'B':
    return 2;
  default:
    OPTIMIZE_ASSUME(false); // never get here
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1802965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802965</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 03 Nov 2009 23:22:53 GMT</pubDate></item><item><title><![CDATA[Reply to Böses Microoptimieren! (Bedingungen) on Tue, 03 Nov 2009 23:50:13 GMT]]></title><description><![CDATA[<p>&quot;'Z'-'A' == 26&quot;<br />
25 - sry^^</p>
<p>&quot;Warum?&quot;<br />
Weil ich iwas falsch gemacht hatte und somit zu der auffassung gekommen war, dass zumindest der msvc die beiden switchs nicht zusammenfassen kann - aber habs gerad noch ma getestet und er scheint es doch zu können^^</p>
<p>MSVC08</p>
<pre><code class="language-asm">int test()
{
012819A0  push        ecx  
	char tmp;
	std::cin &gt;&gt; tmp;
012819A1  lea         eax,[esp+3] 
012819A5  push        eax  
012819A6  call        std::operator&gt;&gt;&lt;char,std::char_traits&lt;char&gt; &gt; (12842D0h) 

	switch(tmp)
012819AB  movsx       ecx,byte ptr [esp+7] 
012819B0  lea         eax,[ecx-41h] 
012819B3  add         esp,4 
012819B6  cmp         eax,3 
012819B9  ja          $LN9+7 (12819D0h) 
012819BB  jmp         dword ptr  (12819E8h)[eax*4] 
	{
	case 'A':
		return 1;
012819C2  mov         eax,1 
	case 'D':
		return 4;
	}
	switch(tmp)
	{
	case 'a':
		return 1;
	case 'b':
		return 2;
	case 'c':
		return 3;
	case 'd':
		return 4;
	default:
		__assume(0);
	}
}
012819C7  pop         ecx  
012819C8  ret              
	case 'B':
		return 2;
	case 'C':
		return 3;
012819C9  mov         eax,3 
	case 'D':
		return 4;
	}
	switch(tmp)
	{
	case 'a':
		return 1;
	case 'b':
		return 2;
	case 'c':
		return 3;
	case 'd':
		return 4;
	default:
		__assume(0);
	}
}
012819CE  pop         ecx  
012819CF  ret              
	case 'D':
		return 4;
	}
	switch(tmp)
012819D0  add         ecx,0FFFFFF9Fh 
012819D3  jmp         dword ptr  (12819F8h)[ecx*4] 
	{
	case 'a':
		return 1;
	case 'b':
		return 2;
012819DA  mov         eax,2 
	case 'D':
		return 4;
	}
	switch(tmp)
	{
	case 'a':
		return 1;
	case 'b':
		return 2;
	case 'c':
		return 3;
	case 'd':
		return 4;
	default:
		__assume(0);
	}
}
012819DF  pop         ecx  
012819E0  ret              
	case 'c':
		return 3;
	case 'd':
		return 4;
012819E1  mov         eax,4 
	default:
		__assume(0);
	}
}
012819E6  pop         ecx  
012819E7  ret
</code></pre>
<p>bb</p>
<p>PS: wenn mans nat ganz vorbildlich machen will, sollte man nat hustbaers makro verwenden, aber ich geh jz besser schlafen^^ gn8</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802969</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 03 Nov 2009 23:50:13 GMT</pubDate></item></channel></rss>