<?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[C++ Code Optimierung]]></title><description><![CDATA[<p>Ich versuche gerade Teile meines Codes zu optimieren und will im Vorfeld durch eure Meinungen überlegen ob es sinnvoll ist.</p>
<p>Ich habe eine Methode, welche eine von 256 weiteren Methoden aufrufen soll. Dafür befinden sich Zeiger auf diese 256 Methoden in einem Feld. Die initiale Methode ermittelt also eine Zielmethode und ruft diese im Zeigerfeld auf. siehe: (this-&gt;*array[Zielmethode])();</p>
<p>Diese Methode soll 2 - 3 Mio mal pro Sekunde durchlaufen.</p>
<p>Wäre es effizienter, wenn ich auf das Feld, welches Zeiger auf die 256 Methoden enthält, verzichte und das ganze über eine switch/case Anweisung löse? Also ein switch mit 256 cases. Jedes case enthält einen direkten Methodenaufruf.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/169604/c-code-optimierung</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 23:04:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/169604.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 06 Jan 2007 21:03:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to C++ Code Optimierung on Sat, 06 Jan 2007 21:03:19 GMT]]></title><description><![CDATA[<p>Ich versuche gerade Teile meines Codes zu optimieren und will im Vorfeld durch eure Meinungen überlegen ob es sinnvoll ist.</p>
<p>Ich habe eine Methode, welche eine von 256 weiteren Methoden aufrufen soll. Dafür befinden sich Zeiger auf diese 256 Methoden in einem Feld. Die initiale Methode ermittelt also eine Zielmethode und ruft diese im Zeigerfeld auf. siehe: (this-&gt;*array[Zielmethode])();</p>
<p>Diese Methode soll 2 - 3 Mio mal pro Sekunde durchlaufen.</p>
<p>Wäre es effizienter, wenn ich auf das Feld, welches Zeiger auf die 256 Methoden enthält, verzichte und das ganze über eine switch/case Anweisung löse? Also ein switch mit 256 cases. Jedes case enthält einen direkten Methodenaufruf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1204668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204668</guid><dc:creator><![CDATA[PiCiJi]]></dc:creator><pubDate>Sat, 06 Jan 2007 21:03:19 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Code Optimierung on Sat, 06 Jan 2007 21:13:36 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>schneller als der Array-Zugriff kann es nicht gehen, auch mit switch nicht. (Ich gehe davon aus, das das Erzeugen und Initialisieren des Arrays nicht mit in die Zeitfrage gerechnet wird)</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1204675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204675</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Sat, 06 Jan 2007 21:13:36 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Code Optimierung on Sat, 06 Jan 2007 21:16:31 GMT]]></title><description><![CDATA[<p>wieso brauchst du 256 verschiedene funktionen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
ich wette, das kannste alles in eine schreiben <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 />
:xmas2:</p>
<p>akari schrieb:</p>
<blockquote>
<p>schneller als der Array-Zugriff kann es nicht gehen</p>
</blockquote>
<p>welch kühne behauptung. der 'this' ist auch noch dabei, immerhin zwei dereferenzierungen, wenn er pech hat...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1204677</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204677</guid><dc:creator><![CDATA[ten]]></dc:creator><pubDate>Sat, 06 Jan 2007 21:16:31 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Code Optimierung on Sat, 06 Jan 2007 21:18:38 GMT]]></title><description><![CDATA[<p>ten schrieb:</p>
<blockquote>
<p>wieso brauchst du 256 verschiedene funktionen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
ich wette, das kannste alles in eine schreiben <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 />
:xmas2:</p>
</blockquote>
<p>hey, da kann ich nur zugeben <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/1204680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204680</guid><dc:creator><![CDATA[WinnieX]]></dc:creator><pubDate>Sat, 06 Jan 2007 21:18:38 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Code Optimierung on Sat, 06 Jan 2007 21:29:31 GMT]]></title><description><![CDATA[<p>Bevor ich mich zu irgendwelchen Behauptungen hinreißen alsse, hätte ich gerne mal was Code zwischen den Fingern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1204687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204687</guid><dc:creator><![CDATA[Checker*amp*Murckser]]></dc:creator><pubDate>Sat, 06 Jan 2007 21:29:31 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Code Optimierung on Sat, 06 Jan 2007 21:37:44 GMT]]></title><description><![CDATA[<p>Ja das initialisieren des arrays ist für die Optimierung unrelevant.</p>
<p>Es handelt sich um einen Emulator und die 256 Funktionen sind Maschinenbefehle der zu emulierenden CPU. Diese Funktionen sind zu verschieden um sie sinnvoll zusammenzufassen. Ich frage mich also ob die switch/case Idee schneller abgearbeitet werden kann?</p>
<p>das Feld wird in der Klasse so initialisiert:</p>
<p>void (Cpu::*op_table[256])();</p>
<p>ein Feldelement(Methodenzeiger) wird derart eingefügt:</p>
<p>op_table[0x6d] = &amp;Cpu::op_adc_absolute;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1204689</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204689</guid><dc:creator><![CDATA[PiCiJi]]></dc:creator><pubDate>Sat, 06 Jan 2007 21:37:44 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Code Optimierung on Sat, 06 Jan 2007 21:40:32 GMT]]></title><description><![CDATA[<p>welche cpu ist das?<br />
du solltest vielleicht mal rauskriegen, wie die echte cpu befehle dekodiert, dann kommste bestimmt mit viel weniger als 256 funktionen aus...<br />
:xmas2:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1204692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204692</guid><dc:creator><![CDATA[ten]]></dc:creator><pubDate>Sat, 06 Jan 2007 21:40:32 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Code Optimierung on Sat, 06 Jan 2007 21:55:19 GMT]]></title><description><![CDATA[<p>Wie die Cpu Befehle dekodiert, weis ich. Das Zusammenfassen ähnlicher Maschinenbefehle würde weitere Verzweigungen erfordern und die Lesbarkeit verschlechtern. Ich bin mir auch nicht sicher ob die Performance spürbar steigt, wenn statt 256 nur noch 100 Methoden referenziert werden müssen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1204698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204698</guid><dc:creator><![CDATA[PiCiJi]]></dc:creator><pubDate>Sat, 06 Jan 2007 21:55:19 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Code Optimierung on Sat, 06 Jan 2007 21:56:38 GMT]]></title><description><![CDATA[<p>PiCiJi schrieb:</p>
<blockquote>
<p>Ich frage mich also ob die switch/case Idee schneller abgearbeitet werden kann?</p>
</blockquote>
<p>Ja, die ist schneller weil dann für den Prozessor die u.U. aufwendige Adressenermittlung innerhalb des Arrays entfällt. Allerdings vergrössert sich dadurch der Code erheblich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1204699</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204699</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 06 Jan 2007 21:56:38 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Code Optimierung on Sat, 06 Jan 2007 22:00:52 GMT]]></title><description><![CDATA[<p>Von was zum Teufel redest du?<br />
Die Adresse von jeder Funktion steht zur Compilezeit fest!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1204704</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204704</guid><dc:creator><![CDATA[Entenwickler]]></dc:creator><pubDate>Sat, 06 Jan 2007 22:00:52 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Code Optimierung on Sat, 06 Jan 2007 22:02:59 GMT]]></title><description><![CDATA[<p>Hallo</p>
<blockquote>
<p>aufwendige Adressenermittlung innerhalb des Arrays</p>
</blockquote>
<p>Was denn für eine aufwendige Addressermittlung?<br />
In einen Array sind die Elemente einfach aneinander gehängt. Die Addresse des Elements n ergibt sich also einfach aus Adresse des ersten Elements +n. Das ist einfache Integer-Addition und wird von jeder vernünftigen CPU in einem Schritt erledigt. Und schneller gehts nicht.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1204705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204705</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Sat, 06 Jan 2007 22:02:59 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Code Optimierung on Sat, 06 Jan 2007 22:06:30 GMT]]></title><description><![CDATA[<p>ok ich poste mal etwas mehr Code. Diese Methode ruft den Maschinenbefehl auf.<br />
Die Eigenschaft cycle_pos gibt an welcher Zyklus des aktuellen Maschinenbefehles abgearbeitet werden soll. Wenn cycle_pos = 0 ist, heißt das, daß der aktuelle Maschinenbefehl abgearbeitet wurde und der nächste eingelesen werden muss.</p>
<pre><code>void Cpu::execute_cycle()
{
	if (cycle_pos) (this-&gt;*op_table[opcode])();
	else
	{
		opcode = read_pc(); //nächster Maschinenbefehl
		cycle_pos = 1;     //1. Zyklus des Befehls
	}
}
</code></pre>
<p>Ein abgearbeiteter Zyklus eines Maschinenbefehles erhöht cycle_pos automatisch um 1 oder setzt es am Ende wieder auf 0.</p>
<p>Ein Maschinenbefehl z.B.</p>
<pre><code>void Cpu::op_and_absolute()
{
	switch(cycle_pos++)
	{
		case 1:
			aa_l = read_pc();
			break;
		case 2:
			aa_h = read_pc();
			break;
		case 3:
			if(reg_p_m) check_for_interrupts();
			data_l = read_aa(DBR_, aa_w);
			if(reg_p_m) { logic_and_b(); cycle_pos = 0; }
			break;
		case 4:
			check_for_interrupts();
			data_h = read_aa(DBR_, aa_w + 1);
			logic_and_w();
			cycle_pos = 0;
			break;
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1204708</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204708</guid><dc:creator><![CDATA[PiCiJi]]></dc:creator><pubDate>Sat, 06 Jan 2007 22:06:30 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Code Optimierung on Sat, 06 Jan 2007 22:26:04 GMT]]></title><description><![CDATA[<p>So meine ich das :</p>
<pre><code>if (cycle_pos) (this-&gt;*op_table[opcode])();
</code></pre>
<p>Hier muss der Prozessor erst den Wert von &quot;opcode&quot; ermitteln, dann anhand dieses Wertes den Index (Adresse) innerhalb von &quot;op_table&quot;, dann kann die Adresse von &quot;op_table[opcode]&quot; geladen und ausgeführt werden.</p>
<pre><code>switch(cycle_pos++)
{
  case 1:
  case 2:
  case 3:
 (...)
}
</code></pre>
<p>Hier &quot;hüpft&quot; der Prozessor ein paar mal und ist dann gleich dort wo er sein soll (ohne Umwege gewissermassen).</p>
<p>Bitte schreibt jetzt nicht, dass das &quot;Erbsen zählen&quot; ist :-).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1204714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204714</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 06 Jan 2007 22:26:04 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Code Optimierung on Sat, 06 Jan 2007 23:04:10 GMT]]></title><description><![CDATA[<p>Vergleichst du Bananen mit Kirschen? Die beiden Codes stehen in keinem Zusammenhang.</p>
<p>Was du da laberst ist sowas von schwachsinnig. Ich sage auch das swich ist schneller, aber nur weil da der Compiler besser optimieren kann und die meisten Calls mit inlining einspart.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1204721</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204721</guid><dc:creator><![CDATA[Entenwickler]]></dc:creator><pubDate>Sat, 06 Jan 2007 23:04:10 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Code Optimierung on Sat, 06 Jan 2007 23:53:16 GMT]]></title><description><![CDATA[<p>Entenwickler schrieb:</p>
<blockquote>
<p>Was du da laberst ist sowas von schwachsinnig.</p>
</blockquote>
<p>Fertig ? Gut.</p>
<p>Mein zweites BEISPIEL von oben kann auch so lauten :</p>
<pre><code>switch(opcode)
{
  case 1: {op_and_absolute(); break;}
  case 2: {op_add_absolute(); break;}
  case 3: {op_xor_absolute(); break;}
 (...)
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1204738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204738</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 06 Jan 2007 23:53:16 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Code Optimierung on Sun, 07 Jan 2007 00:51:41 GMT]]></title><description><![CDATA[<p>Hast du bereits getestet, dass dein bisheriger Code zu langsam ist? Oder bildest du dir ein er wäre zu langsam und optimierst auf Verdacht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1204757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204757</guid><dc:creator><![CDATA[lolz]]></dc:creator><pubDate>Sun, 07 Jan 2007 00:51:41 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Code Optimierung on Sun, 07 Jan 2007 08:42:07 GMT]]></title><description><![CDATA[<p>Nein auf Verdacht optimiere ich nicht. Der Code läuft schnell genug auf meinem 3,5 GHz Amd aber viel Potenzial ist nicht mehr. Später soll jeweils ein zusätzliche Prozessor emuliert werden und dann wird es eng. Deswegen überlege ich bei den häufig frequentierten Funktionen, wie man sie optimieren könnte. Ausserdem kompiliere ich den Code mit Instrument Guided Optimization. Das bringt noch mal 30% mehr Leistung in meinem Fall. Ich verwende in meinem Code keine inlines oder sotiere case Anweisungen nicht mit den am häufigsten ausgeführten nach oben. Ich verlasse mich hierbei auf die Instrument Guided Optimization.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1204816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204816</guid><dc:creator><![CDATA[PiCiJi]]></dc:creator><pubDate>Sun, 07 Jan 2007 08:42:07 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Code Optimierung on Sun, 07 Jan 2007 09:39:48 GMT]]></title><description><![CDATA[<p>Schneller als ein indirekter Sprung? Weiss nicht...<br />
Einen Versuch ist es Wert. Wenn dann solltest du auf jeden Fall sicherstellen dass der Compiler weiss dass alle Werte die &quot;opcode&quot; halten kann auch als &quot;case&quot; vorkommen, sonst könnte er auf die dumme Idee kommen statt eines Jumptables was komplizierteres zu verwenden.<br />
Also z.B.</p>
<pre><code class="language-cpp">void foo(unsigned char opcode)
{
    switch(opcode) // wenn opcode ein int wäre müsste der Compiler hier Code erzeugen der dafür
                   // sorgt das der ganze Block übersprungen wird bei Werten &lt; 0 oder &gt; 255
    {
    case 0:
    //...
    case 255:
    // und _kein_ default:
    }
}
</code></pre>
<p>Nochwas: Als Jumptable werden soweit ich weiss 2 verschiedene Dinge bezeichnet, einmal das was du schon machst (mit dem Array aus Funktionszeigern), und einmal ein &quot;Table&quot; aus lauter &quot;jump&quot; Befehlen, also inetwa sowas:</p>
<pre><code>table:
    jmp Case0Function
    jmp Case1Function
    jmp Case2Function
    ...
    jmp Case255Function
</code></pre>
<p>Bei so einem Table kannst du dann einfach die Adresse &quot;table + opcode * N&quot; auf einen Funktionszeiger casten, und die Funktion aufrufen (wobei N die Länge eines Sprundbefehls inklusive Daten ist). Der indirekte Sprung fällt dadurch weg, allerdings hast du dafür insgesamt einen Sprung mehr. N sollte dabei möglichst eine 2er Potenz sein, also wohl 8. Dazu padded man dann einfach die nicht vom Sprundbefehl verbrauchten Bytes mit einem NOP.</p>
<p>Sowas kann man natürlich nicht direkt in C++ implementieren, d.h. du müsstest inline Assembler verwenden.</p>
<p>Noch zwei Sachen:<br />
Brauchst du wirklich eine zyklengenaue Emulation? Wenn nicht würde das sicher einiges an Speedup bringen auf die zu verzichten.</p>
<p>Oder guck dir doch mal den Source von anderen CPU Emulatoren an, gibt ja einige Open Source Emulatoren für z.B. 68k und andere CPUs. Im MAME Projekt wird davon z.B. massiv gebraucht gemacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1204832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204832</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 07 Jan 2007 09:39:48 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Code Optimierung on Sun, 07 Jan 2007 10:26:02 GMT]]></title><description><![CDATA[<blockquote>
<p>Wenn dann solltest du auf jeden Fall sicherstellen dass der Compiler weiss dass alle Werte die &quot;opcode&quot; halten kann auch als &quot;case&quot; vorkommen, sonst könnte er auf die dumme Idee kommen statt eines Jumptables was komplizierteres zu verwenden.</p>
</blockquote>
<p>Ja das ist sichergestellt. opcode ist vom Typ unsigned char. also 8 bit = 256 Werte. Ich werde es also mal versuchen.<br />
Auf Assembler will ich komplett verzichten. Die zyklengenaue Emulation ist auch notwendig. Zugegeben Nutzen und Kosten stehen in keinem guten Verhältnis. Nur wenige Spiele benötigen diese Genauigkeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1204851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204851</guid><dc:creator><![CDATA[PiCiJi]]></dc:creator><pubDate>Sun, 07 Jan 2007 10:26:02 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Code Optimierung on Sun, 07 Jan 2007 12:05:27 GMT]]></title><description><![CDATA[<p>ok ich habe es getestet. Im Debug Modus war die Ausführung mit der switch/case Idee fast 10% langsamer. Im release Mode mit profile guided optimization war kein Unterschied festzustellen, da der Compiler die cases sicher neu sortiert nach den für das spezielle Spiel am häufigsten verwendeten nach oben. Zusammenfassend muss ich die switch/case Idee verwerfen.</p>
<p>Ich emuliere 4 Prozessoren. Jeder Prozessor ist innerhalb einer Klasse beschrieben. Für jede Klasse wird nur genau eine Instanz angelegt. Kann man da vielleicht ansetzen? Kann man dem Compiler mitteilen, dass es bei einer Instanz bleibt? Ich frage mich, ob es vorteilhafter wäre auf das Klassenkonzept zu verzichten in Bezug auf die Ausführungsgeschwindigkeit. Wobei ich gelesen habe, dass aktuelle Compiler das Klassenkonzept gut auflösen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1204895</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204895</guid><dc:creator><![CDATA[PiCiJi]]></dc:creator><pubDate>Sun, 07 Jan 2007 12:05:27 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Code Optimierung on Sun, 07 Jan 2007 12:16:49 GMT]]></title><description><![CDATA[<p>PiCiJi schrieb:</p>
<blockquote>
<p>ok ich habe es getestet. Im Debug Modus war die Ausführung mit der switch/case Idee fast 10% langsamer. Im release Mode mit profile guided optimization war kein Unterschied festzustellen, da der Compiler die cases sicher neu sortiert nach den für das spezielle Spiel am häufigsten verwendeten nach oben. Zusammenfassend muss ich die switch/case Idee verwerfen.</p>
</blockquote>
<p>Das sortieren ist quatsch. Beim Case wird eine Sprungtabelle erstellt in der steht, wo die zieladresse ist.<br />
<a href="http://webster.cs.ucr.edu/AoA/Windows/HTML/LowLevelControlStructsa2.html" rel="nofollow">http://webster.cs.ucr.edu/AoA/Windows/HTML/LowLevelControlStructsa2.html</a><br />
Also fast das selbe wie bei deinem array. <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>Du könntest die Klassen static al s Singleton machen, wobei ich bezweifle, dass das was bring.</p>
<p>Schaust du bei deinem Profiling immer nur auf die gesammtzeit? Du musst doch wissen welche funktionen lang brauchen und diese dann optimieren, nicht raten was was bringen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1204902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204902</guid><dc:creator><![CDATA[nervenflatterer]]></dc:creator><pubDate>Sun, 07 Jan 2007 12:16:49 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Code Optimierung on Sun, 07 Jan 2007 12:18:02 GMT]]></title><description><![CDATA[<p>Nichts als Spekulationen. Teste das ganze doch mal mit einem Profiler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1204903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204903</guid><dc:creator><![CDATA[Entenwickler]]></dc:creator><pubDate>Sun, 07 Jan 2007 12:18:02 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Code Optimierung on Sun, 07 Jan 2007 12:39:49 GMT]]></title><description><![CDATA[<p>Gibt es da spezielle Software für ein Profiling oder ein Zusatzmodul für Visual 2005 (hoffentlich kostenlos)? Es wäre ziemlich interessant mehr über die Abarbeitung einzelner Funktionen zu erfahren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1204922</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204922</guid><dc:creator><![CDATA[PiCiJi]]></dc:creator><pubDate>Sun, 07 Jan 2007 12:39:49 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Code Optimierung on Sun, 07 Jan 2007 12:46:47 GMT]]></title><description><![CDATA[<p>Ich verwende den profiler von compuware. Der Integriert sich nahtlos in das VS.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1204929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1204929</guid><dc:creator><![CDATA[lolz]]></dc:creator><pubDate>Sun, 07 Jan 2007 12:46:47 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Code Optimierung on Sun, 07 Jan 2007 18:43:33 GMT]]></title><description><![CDATA[<p>Du meinst den Profiler DevPartner Performance Analysis Community Edition?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1205172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1205172</guid><dc:creator><![CDATA[PiCiJi]]></dc:creator><pubDate>Sun, 07 Jan 2007 18:43:33 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Code Optimierung on Sun, 07 Jan 2007 18:54:37 GMT]]></title><description><![CDATA[<p>hat vs nicht 'nen eingebauten profiler? der alte vs6 hatte das noch.</p>
<p>aber mal zum thema: wenn man ein array aus function pointern 'const' oder 'static const' definiert, alle elemente initialisiert und geschwindigkeitsoptimierung einschaltet, dann kann es sein, dass ein compiler sehr performanten code draus macht, der sich in puncto speed nicht von der switch/case-variante unterscheidet. man sollte sich auf jeden fall mal den erzeugten asm-code anschauen...<br />
:xmas2:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1205176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1205176</guid><dc:creator><![CDATA[ten]]></dc:creator><pubDate>Sun, 07 Jan 2007 18:54:37 GMT</pubDate></item></channel></rss>