<?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[Arrayindex zur Compilezeit oder zur Laufzeit?]]></title><description><![CDATA[<p>Wäre der Code in <strong>B</strong> laufzeiteffizienter (schneller) als der Code in <strong>A</strong>? Ich bin mir nicht sicher, ob Version <strong>B</strong> etwas bringt, ich schätze mal die Executable wird deutlich grösser, wenn ich alle Algorithmen einer Schach-KI so aufbaue. Bevor ich es teste, würde mich eure Meinung dazu interessieren, ob es einen messbaren Unterschied macht, wenn die Arrayindices (0 oder 1) innerhalb der Hauptfunktionen (also den Templates) bereits zur Compilezeit bekannt sind (Version <strong>B</strong>).</p>
<p>Ist eine solche Konstruktion mit Templates (Version <strong>B</strong>) wie in diesem vereinfachten und stark gekürzten Beispiel sinnvoll?</p>
<p>Danke schonmal für eure Statements <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><strong>A</strong></p>
<pre><code class="language-cpp">void do_something(int me, int you, int move) {
  int from;
  int to;

  from=move_from(move);
  to=move_to(move);

  piece_on[from]=PIECE_NONE;
  piece_bb[me]&amp;=clear_bb[from];
  piece_bb[me]|=set_bb[to];

  piece_bb[you]&amp;=clear_bb[to];
  knight_bb[you]&amp;=clear_bb[to];
  piece_ct[you]--;
  knight_ct[you]--;
  key_pieces^=random_knight[you][to];
  key_material^=random_knight_material[you][knight_ct[you&rsqb;&rsqb;;

  key_pieces^=random_queen[me][from];
  key_pieces^=random_queen[me][to];
  queen_bb[me]&amp;=clear_bb[from];
  queen_bb[me]|=set_bb[to];
  piece_on[to]=PIECE_QUEEN;
  color_on[to]=me;
}
</code></pre>
<p><strong>B</strong></p>
<pre><code class="language-cpp">const int WHITE=0;
const int BLACK=1;

inline void do_something(int me, int you, int move) {
  if (me == WHITE)
    do_something_tp&lt;WHITE, BLACK&gt;(move);
  else
    do_something_tp&lt;BLACK, WHITE&gt;(move);
}

template&lt;int me, int you&gt;
void do_something_tp(int move) {
  int from;
  int to;

  from=move_from(move);
  to=move_to(move);

  piece_on[from]=PIECE_NONE;
  piece_bb[me]&amp;=clear_bb[from];
  piece_bb[me]|=set_bb[to];

  piece_bb[you]&amp;=clear_bb[to];
  knight_bb[you]&amp;=clear_bb[to];
  piece_ct[you]--;
  knight_ct[you]--;
  key_pieces^=random_knight[you][to];
  key_material^=random_knight_material[you][knight_ct[you&rsqb;&rsqb;;

  key_pieces^=random_queen[me][from];
  key_pieces^=random_queen[me][to];
  queen_bb[me]&amp;=clear_bb[from];
  queen_bb[me]|=set_bb[to];
  piece_on[to]=PIECE_QUEEN;
  color_on[to]=me;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/253454/arrayindex-zur-compilezeit-oder-zur-laufzeit</link><generator>RSS for Node</generator><lastBuildDate>Sun, 13 Sep 2026 18:19:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/253454.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 02 Nov 2009 16:43:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Arrayindex zur Compilezeit oder zur Laufzeit? on Mon, 02 Nov 2009 16:49:07 GMT]]></title><description><![CDATA[<p>Wäre der Code in <strong>B</strong> laufzeiteffizienter (schneller) als der Code in <strong>A</strong>? Ich bin mir nicht sicher, ob Version <strong>B</strong> etwas bringt, ich schätze mal die Executable wird deutlich grösser, wenn ich alle Algorithmen einer Schach-KI so aufbaue. Bevor ich es teste, würde mich eure Meinung dazu interessieren, ob es einen messbaren Unterschied macht, wenn die Arrayindices (0 oder 1) innerhalb der Hauptfunktionen (also den Templates) bereits zur Compilezeit bekannt sind (Version <strong>B</strong>).</p>
<p>Ist eine solche Konstruktion mit Templates (Version <strong>B</strong>) wie in diesem vereinfachten und stark gekürzten Beispiel sinnvoll?</p>
<p>Danke schonmal für eure Statements <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><strong>A</strong></p>
<pre><code class="language-cpp">void do_something(int me, int you, int move) {
  int from;
  int to;

  from=move_from(move);
  to=move_to(move);

  piece_on[from]=PIECE_NONE;
  piece_bb[me]&amp;=clear_bb[from];
  piece_bb[me]|=set_bb[to];

  piece_bb[you]&amp;=clear_bb[to];
  knight_bb[you]&amp;=clear_bb[to];
  piece_ct[you]--;
  knight_ct[you]--;
  key_pieces^=random_knight[you][to];
  key_material^=random_knight_material[you][knight_ct[you&rsqb;&rsqb;;

  key_pieces^=random_queen[me][from];
  key_pieces^=random_queen[me][to];
  queen_bb[me]&amp;=clear_bb[from];
  queen_bb[me]|=set_bb[to];
  piece_on[to]=PIECE_QUEEN;
  color_on[to]=me;
}
</code></pre>
<p><strong>B</strong></p>
<pre><code class="language-cpp">const int WHITE=0;
const int BLACK=1;

inline void do_something(int me, int you, int move) {
  if (me == WHITE)
    do_something_tp&lt;WHITE, BLACK&gt;(move);
  else
    do_something_tp&lt;BLACK, WHITE&gt;(move);
}

template&lt;int me, int you&gt;
void do_something_tp(int move) {
  int from;
  int to;

  from=move_from(move);
  to=move_to(move);

  piece_on[from]=PIECE_NONE;
  piece_bb[me]&amp;=clear_bb[from];
  piece_bb[me]|=set_bb[to];

  piece_bb[you]&amp;=clear_bb[to];
  knight_bb[you]&amp;=clear_bb[to];
  piece_ct[you]--;
  knight_ct[you]--;
  key_pieces^=random_knight[you][to];
  key_material^=random_knight_material[you][knight_ct[you&rsqb;&rsqb;;

  key_pieces^=random_queen[me][from];
  key_pieces^=random_queen[me][to];
  queen_bb[me]&amp;=clear_bb[from];
  queen_bb[me]|=set_bb[to];
  piece_on[to]=PIECE_QUEEN;
  color_on[to]=me;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1802214</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802214</guid><dc:creator><![CDATA[Tomahawk]]></dc:creator><pubDate>Mon, 02 Nov 2009 16:49:07 GMT</pubDate></item><item><title><![CDATA[Reply to Arrayindex zur Compilezeit oder zur Laufzeit? on Mon, 02 Nov 2009 16:51:31 GMT]]></title><description><![CDATA[<p>wie oft haben wir dir denn schon gesagt, dass du einen profiler nutzen sollst?</p>
<p>ich würde jetzt schon mal behaupten wollen: vernachlässigbar</p>
<p>und da man so und so schon nicht mehr durchsieht, ists auch von der ästhetik her egal...<br />
so als kleiner tip: man kann auch in funktionen wieder funktionen aufrufen und auch dort kann man wieder funktionen aufrufen und - du wirst es schon ahnen - auch da könnte man wieder fkt aufrufen...</p>
<p>wenn ich aber so etwas sehe:</p>
<pre><code class="language-cpp">piece_on[from]=PIECE_NONE;
  piece_bb[me]&amp;=clear_bb[from];
  piece_bb[me]|=set_bb[to];

  piece_bb[you]&amp;=clear_bb[to];
  knight_bb[you]&amp;=clear_bb[to];
  piece_ct[you]--;
  knight_ct[you]--;
  key_pieces^=random_knight[you][to];
  key_material^=random_knight_material[you][knight_ct[you&rsqb;&rsqb;;

  key_pieces^=random_queen[me][from];
  key_pieces^=random_queen[me][to];
  queen_bb[me]&amp;=clear_bb[from];
  queen_bb[me]|=set_bb[to];
  piece_on[to]=PIECE_QUEEN;
  color_on[to]=me;
</code></pre>
<p>hab ich nicht mal mehr lust, mir zusammenzureimen, was dort passieren soll...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802220</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 02 Nov 2009 16:51:31 GMT</pubDate></item><item><title><![CDATA[Reply to Arrayindex zur Compilezeit oder zur Laufzeit? on Mon, 02 Nov 2009 16:52:03 GMT]]></title><description><![CDATA[<p>Das ist doch genau die gleiche Frage wie in deinem letzten Thread:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-253330-and-highlight-is-.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-253330-and-highlight-is-.html</a><br />
Was bringt dich zu der Annahme, du könntest dieses Mal andere Antworten bekommen? Willst du solange fragen, bis du eine Antwort bekommst, die dir passt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802221</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 02 Nov 2009 16:52:03 GMT</pubDate></item><item><title><![CDATA[Reply to Arrayindex zur Compilezeit oder zur Laufzeit? on Mon, 02 Nov 2009 17:12:22 GMT]]></title><description><![CDATA[<p><strong><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16305">@unskilled</a></strong></p>
<p>Man kann meines Wissens erst Profilen, wenn man etwas Lauffähiges zum Profilen hat. Davon bin ich noch weit entfernt. Ausserdem lassen mit den Profilern, die ich jetzt kennengelernt habe nur Laufzeitverhalten zwischen den Funktionen eines Algorithmus messen.</p>
<p><strong><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a></strong></p>
<p>Meinen Compiler habe ich vor 4 Wochen installiert. Jetzt bin ich auf den Template-Mechanismus gestossen und schlage diesen, im Gegensatz zu meinen letzten Posting, hier mal als Alternative vor. So als blutiger Anfänger muss ich mich erst noch etwas im Dschungel der Möglichkeiten orientieren. C++ scheint einige interessante Optionen zu bieten.</p>
<p>Hätte ich etwas mehr Ahnung vom Programmieren, würde ich euch auch nicht eure kostbare Zeit mit meinen naiven Fragen stehlen... <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/1802233</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802233</guid><dc:creator><![CDATA[Tomahawk]]></dc:creator><pubDate>Mon, 02 Nov 2009 17:12:22 GMT</pubDate></item><item><title><![CDATA[Reply to Arrayindex zur Compilezeit oder zur Laufzeit? on Mon, 02 Nov 2009 17:23:25 GMT]]></title><description><![CDATA[<p>Tomahawk schrieb:</p>
<blockquote>
<p>Man kann meines Wissens erst Profilen, wenn man etwas Lauffähiges zum Profilen hat. Davon bin ich noch weit entfernt.</p>
</blockquote>
<p>Und genau da liegt dein Problem...</p>
<p>Schreib doch einfach erstmal etwas, was zumindest irgendwie lauffähig ist. Achte darauf, daß dein Code sauber strukturiert und lesbar bleibt (also z.B. nicht so wie das, was du oben gepostet hast). Aber halte dich nicht mit solchen Details auf, von denen du noch nichtmal weißt, ob sie später, wenn das Programm fertig ist, überhaupt eine Rolle spielen.</p>
<p>Und wenn dein Programm dann irgendwann mal lauffähig ist, dann läßt du es durch einen Profiler laufen und guckst, an welchen Stellen im Code es überhaupt die meiste Zeit verbringt (gut möglich, daß das nicht die sind, die du erwarten würdest). Und genau die versuchst du dann zu optimieren, z.B. indem du mehrere Varianten implementierst, und dann wiederum mit dem Profiler guckst, welche davon am schnellsten ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802243</guid><dc:creator><![CDATA[dooooomi]]></dc:creator><pubDate>Mon, 02 Nov 2009 17:23:25 GMT</pubDate></item><item><title><![CDATA[Reply to Arrayindex zur Compilezeit oder zur Laufzeit? on Mon, 02 Nov 2009 18:18:45 GMT]]></title><description><![CDATA[<p>Falls man mal nur wissen will, welche Programmiertechnik an sich schneller oder langsamer ist, kann man sowas auch direkt in einem kleinen Miniprogramm prüfen. Bei deinen Arrayzugriffen könnte man das zum Beispiel so machen:</p>
<p>(Vorsicht: Plattformabhängig, geht nur unter Linuxoiden Systemen)</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;ctime&gt;
#include &lt;cstdlib&gt;

using namespace std;

const long int MAX_I=1000000000;

unsigned long long  get_ticks()
{
    timespec t;
    clock_gettime(CLOCK_REALTIME,&amp;t);
    return t.tv_sec*1000000000ll+t.tv_nsec;
}

int array[2]={1,2};

long int test_d_indexed(){
  long int dummy=0;       // Das Ergebnis muss für irgendwas genutzt werden, damit es nicht wegoptimiert wird
  srand(time(NULL));
  for(long int i=0; i&lt; MAX_I; ++i){
    int j = rand() % 2;   // Benutze Zufall, damit der Zugriff nicht optimiert werden kann
    dummy += array[j];
  }
  return dummy;
}

long int test_c_indexed(){
  long int dummy=0;
  srand(time(NULL));
  for(long int i=0; i&lt; MAX_I; ++i){
    int j = rand() % 2;
    if (j) dummy += array[0];
    else dummy += array[1];
  }
  return dummy;
}

template&lt;int i&gt; inline int t_array(){
  return array[i];
}

long int test_t_indexed(){
  long int dummy=0;
  srand(time(NULL));
  for(long int i=0; i&lt; MAX_I; ++i){
    int j = rand() % 2;
    if (j) dummy += t_array&lt;0&gt;();
    else dummy += t_array&lt;1&gt;();
  }
  return dummy;
}

int main(){
  unsigned long long before, after;
  long int dummy1,dummy2,dummy3;
  before = get_ticks();
  dummy1=test_d_indexed();
  after = get_ticks();
  cout &lt;&lt; &quot;Runtime indexed: &quot; &lt;&lt; after-before &lt;&lt; endl;

  before = get_ticks();
  dummy2=test_c_indexed();
  after = get_ticks();
  cout &lt;&lt; &quot;Compiletime statically indexed: &quot; &lt;&lt; after-before &lt;&lt; endl;

  before = get_ticks();
  dummy3=test_t_indexed();
  after = get_ticks();
  cout &lt;&lt; &quot;Compiletime template indexed: &quot; &lt;&lt; after-before &lt;&lt; endl;

  cout &lt;&lt; endl &lt;&lt; (dummy1+dummy2+dummy3) % 1&lt;&lt;endl; // Benutze die Ergebnisse um eine 0 zu berechnen, damit nicht der ganze Code wegoptimiert wird.
}
</code></pre>
<p>Ich habe das Programm einmal mit GNU Compiler und einmal mit intel Compiler auf jeweils höchster Optimierungsstufe übersetzt und jeweils ca. 10 mal mit maximaler Prozesspriorität ausgeführt. Dabei konnte ich keine großen Unterschiede feststellen. Die Tendenz schien jedoch zu sein, dass die erste Methode ein wenig (~5%) langsamer ist und die zweite und dritte Methode genau gleich schnell. Der Intel Compiler scheint auch ein kleines bisschen schnelleren (~5%) Code erzeugt zu haben (möglicherweise andere Zufallsgeneratorimplementierung). Die meisten Testläufe erzeugten konsistente Ergebnisse, manchmal gab es jedoch auch Ausreißer, die dann gerne mal 20-50% langsamer waren, ohne ersichtlichen Grund (vielleicht ein anderer Prozess mit sehr hoher Priorität der dazwischen gefunkt hat).</p>
<p>Man beachte, dass hier der Anteil der Arrayzugriffe am Gesamtcode extrem hoch ist. Es passiert sonst fast gar nichts anderes im Programm. Trotzdem ist der Unterschied zwischen den drei Methoden sehr gering.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802261</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 02 Nov 2009 18:18:45 GMT</pubDate></item><item><title><![CDATA[Reply to Arrayindex zur Compilezeit oder zur Laufzeit? on Mon, 02 Nov 2009 18:40:22 GMT]]></title><description><![CDATA[<p>Danke für das Experiment!</p>
<p>Das Ergebnis wäre rein qualitativ zu erwarten gewesen, da vermutlich Experiment 2 und 3 vom Compiler in sehr ähnlichen Maschinencode übersetzt worden sind. Nur dass es sich quantitativ im Bereich von ~5% gegenüber Experiment 3 bewegt, ist erstaunlich wenig.</p>
<p>Wenn keine weiteren Bugs in meinem neuen Code sind, dann könnte die Chesscore bereits in 1-2 Tagen lauffähig sein und ich kann ähnliche Experimente (Brute-Force Rekursionen) zur Bestimmung des Laufzeitverhaltens machen.</p>
<p><strong>Gute Nacht!</strong></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802278</guid><dc:creator><![CDATA[Tomahawk]]></dc:creator><pubDate>Mon, 02 Nov 2009 18:40:22 GMT</pubDate></item><item><title><![CDATA[Reply to Arrayindex zur Compilezeit oder zur Laufzeit? on Mon, 02 Nov 2009 18:48:10 GMT]]></title><description><![CDATA[<p>Tomahawk schrieb:</p>
<blockquote>
<p>Danke für das Experiment!</p>
<p>Das Ergebnis wäre rein qualitativ zu erwarten gewesen, da vermutlich Experiment 2 und 3 vom Compiler in sehr ähnlichen Maschinencode übersetzt worden sind. Nur dass es sich quantitativ im Bereich von ~5% bewegt gegenüber Experiment 3 bewegt, ist erstaunlich wenig.</p>
</blockquote>
<p>Und ich war erstaunt, dass Methode 1 langsamer war. Ich hätte nämlich Geld darauf gesetzt, dass es deutlich schneller ist, denn if-Abfragen sind in der Regel recht teuer.</p>
<p>edit: Ich würde sogar behaupten, dass 2 und 3 identischen Maschinencode haben dürften, aber ich kann nicht so gut Assembler um die Compilerausgabe auf dem Optimierungsniveau zu durchschauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1802283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1802283</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 02 Nov 2009 18:48:10 GMT</pubDate></item></channel></rss>