<?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[optimaler Arrayzugriff?]]></title><description><![CDATA[<p>Hallo Gemeinde,</p>
<p>ich habe mal wieder eine Frage.</p>
<p>In meinem numerischen Code habe ich nun mal mit Arrays und Schleifen zu tun. Nun geht es mir um einen optimalen Zugriff.</p>
<pre><code>struct A
{
  int ni;
  int nj;
  double x;
};

A a[iMax];
...
for(int i=0; i!=iMax; ++i)
{
  fkt(a[i].ni, a[i].nj, a[i].x);
}
</code></pre>
<pre><code>for(int i=0; i!=iMax; ++i)
{
  A  *pA = &amp;a[i];
  fkt(pA-&gt;ni, pA-&gt;nj, pA-&gt;x);
}
</code></pre>
<p>Bringt mir die 2. Variante Vorteile bzgl. Geschwindigkeit oder kann ich auch ohne Bedenken die 1. Variante nehmen da der Compiler das ohnehin optimiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/320238/optimaler-arrayzugriff</link><generator>RSS for Node</generator><lastBuildDate>Fri, 24 Jul 2026 04:50:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/320238.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 21 Sep 2013 06:01:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to optimaler Arrayzugriff? on Sat, 21 Sep 2013 06:37:50 GMT]]></title><description><![CDATA[<p>Hallo Gemeinde,</p>
<p>ich habe mal wieder eine Frage.</p>
<p>In meinem numerischen Code habe ich nun mal mit Arrays und Schleifen zu tun. Nun geht es mir um einen optimalen Zugriff.</p>
<pre><code>struct A
{
  int ni;
  int nj;
  double x;
};

A a[iMax];
...
for(int i=0; i!=iMax; ++i)
{
  fkt(a[i].ni, a[i].nj, a[i].x);
}
</code></pre>
<pre><code>for(int i=0; i!=iMax; ++i)
{
  A  *pA = &amp;a[i];
  fkt(pA-&gt;ni, pA-&gt;nj, pA-&gt;x);
}
</code></pre>
<p>Bringt mir die 2. Variante Vorteile bzgl. Geschwindigkeit oder kann ich auch ohne Bedenken die 1. Variante nehmen da der Compiler das ohnehin optimiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2354270</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2354270</guid><dc:creator><![CDATA[andreasgeorg]]></dc:creator><pubDate>Sat, 21 Sep 2013 06:37:50 GMT</pubDate></item><item><title><![CDATA[Reply to optimaler Arrayzugriff? on Sat, 21 Sep 2013 06:52:34 GMT]]></title><description><![CDATA[<p>Danke für die Antwort. Das heißt nach der Optimierung bleibt tatsächlich ein Unterschied?</p>
<p>Das Beispiel ist halt stark auf die Frage reduziert. Somit ist das nicht immer machbar auch weil es sich um gewachsenen Codes, zu Teil auch aus FORTRAN77 übersetzte handelt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2354274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2354274</guid><dc:creator><![CDATA[andreasgeorg]]></dc:creator><pubDate>Sat, 21 Sep 2013 06:52:34 GMT</pubDate></item><item><title><![CDATA[Reply to optimaler Arrayzugriff? on Sat, 21 Sep 2013 07:01:18 GMT]]></title><description><![CDATA[<p>Ich bezweifle, dass da ein unterschied bleibt. Warum sollte der compiler nicht sehen, dass a[i] mehrfach benutzt wird und es dennoch nur einmal bestimmen (bzw. Die adresse davon)? Gewissheit kriegst du letztlich nur indem du dir den assembler-output anschaust. Aber ich würde tippe , dass da identischer code rauskommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2354276</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2354276</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Sat, 21 Sep 2013 07:01:18 GMT</pubDate></item><item><title><![CDATA[Reply to optimaler Arrayzugriff? on Sat, 21 Sep 2013 08:43:11 GMT]]></title><description><![CDATA[<p>Ich bin mir ziemlich sicher, dass keiner der großen Compiler dafür unterschiedlichen Code erzeugt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2354296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2354296</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sat, 21 Sep 2013 08:43:11 GMT</pubDate></item><item><title><![CDATA[Reply to optimaler Arrayzugriff? on Sat, 21 Sep 2013 09:32:18 GMT]]></title><description><![CDATA[<p>Mal davon abgesehen, dass der Compiler das wahrscheinlich besser optimieren kann als du, währe es besser über die Pointer zu iterieren, als über die indices.</p>
<pre><code>A* a_end = a+iMax;
for (A* pA=a; pA!=a_end; ++pA)
    fkt(pA-&gt;ni, pA-&gt;nj, pA-&gt;x);
</code></pre>
<p>Das ist das gleiche, wie:</p>
<pre><code>for (auto pA=std::begin(a); pA!=std::end(a); ++pA)
    fkt(pA-&gt;ni, -&gt;nj, pA-&gt;x);
</code></pre>
<p>und das ist das gleiche wie:</p>
<pre><code>for (auto&amp; pA : a)
    fkt(pA.ni, pA.nj, pA.x);
</code></pre>
<p>Wie man hierbei sieht, ist die beste Lösung identisch mit der übersichtlichsten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2354304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2354304</guid><dc:creator><![CDATA[Marthog]]></dc:creator><pubDate>Sat, 21 Sep 2013 09:32:18 GMT</pubDate></item><item><title><![CDATA[Reply to optimaler Arrayzugriff? on Sat, 21 Sep 2013 09:36:25 GMT]]></title><description><![CDATA[<p>andreasgeorg schrieb:</p>
<blockquote>
<pre><code>for(int i=0; i!=iMax; ++i)
{
  A  *pA = &amp;a[i];
  fkt(pA-&gt;ni, pA-&gt;nj, pA-&gt;x);
}
</code></pre>
</blockquote>
<pre><code class="language-cpp">for(int i=0; i!=iMax; ++i)
{
  A  *pA = a++;
  fkt(pA-&gt;ni, pA-&gt;nj, pA-&gt;x);
}
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">A* a = ...;
A* a_end = a + iMax;
while(a != a_end)
{
  A  *pa = a++;
  fkt(pa-&gt;ni, pa-&gt;nj, pa-&gt;x);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2354305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2354305</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Sat, 21 Sep 2013 09:36:25 GMT</pubDate></item><item><title><![CDATA[Reply to optimaler Arrayzugriff? on Mon, 23 Sep 2013 09:25:37 GMT]]></title><description><![CDATA[<p>Wenn du wirklich so performancekritische Anforderungen hast solltest du dir überlegen, ob du nicht vielleicht eine Bibliothek wie <a href="http://sourceforge.net/projects/blitz/" rel="nofollow">Blitz++</a> einsetzen kannst/möchtest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2354813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2354813</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Mon, 23 Sep 2013 09:25:37 GMT</pubDate></item><item><title><![CDATA[Reply to optimaler Arrayzugriff? on Mon, 23 Sep 2013 13:36:58 GMT]]></title><description><![CDATA[<p>Ich danke Euch allen für die Antworten.</p>
<p>Ich werde erstmal den Code weiter bearbeiten wie bisher und nur ganz vorsichtig Änderungen in Angriff nehmen. Die Varianten kann ich dann ja in verschiedenen Simulationen laufen lassen und messen ob es Unterschiede gibt.</p>
<p>Blitz++ schaue ich mir mal an, bin aber eher skeptisch ob ich damit arbeiten werde. Im Zweifel ist eine lauffähige Version wichtiger als der mögliche Gewinn - wie gesagt es handelt sich um alte Codes aus Fortran Zeiten die übersetzt habe bzw. noch daran arbeite.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2354895</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2354895</guid><dc:creator><![CDATA[andreasgeorg]]></dc:creator><pubDate>Mon, 23 Sep 2013 13:36:58 GMT</pubDate></item><item><title><![CDATA[Reply to optimaler Arrayzugriff? on Mon, 23 Sep 2013 13:51:42 GMT]]></title><description><![CDATA[<p>andreasgeorg schrieb:</p>
<blockquote>
<p>Die Varianten kann ich dann ja in verschiedenen Simulationen laufen lassen und messen ob es Unterschiede gibt.</p>
</blockquote>
<p>Vergiss nicht, die Compileroptimierung auf das bestmögliche einzustellen und gegebenenfalls auch SSE, SSE2 oder so anzugeben oder entsprechende Prozessortypen (z.B. core2) einzustellen.<br />
Im Allgemeinen gilt aber, dass der gesamt Code erstmal so übersichtlich wie möglich geschrieben wird und wenn alles funktioniert, bestimmt man mit dem Profiler die Engpässe und optimiert diese von Hand auf das Maximum, aber vorher nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2354898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2354898</guid><dc:creator><![CDATA[Marthog]]></dc:creator><pubDate>Mon, 23 Sep 2013 13:51:42 GMT</pubDate></item><item><title><![CDATA[Reply to optimaler Arrayzugriff? on Mon, 23 Sep 2013 14:21:16 GMT]]></title><description><![CDATA[<p>Marthog schrieb:</p>
<blockquote>
<p>Im Allgemeinen gilt aber, dass der gesamt Code erstmal so übersichtlich wie möglich geschrieben wird und wenn alles funktioniert, bestimmt man mit dem Profiler die Engpässe und optimiert diese von Hand auf das Maximum, aber vorher nicht.</p>
</blockquote>
<p>Nö, das ist mir zu stark. Man soll Performance von Anfang an mit im Auge haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2354910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2354910</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 23 Sep 2013 14:21:16 GMT</pubDate></item><item><title><![CDATA[Reply to optimaler Arrayzugriff? on Mon, 23 Sep 2013 14:25:18 GMT]]></title><description><![CDATA[<blockquote>
<p>bestimmt man mit dem Profiler die Engpässe und optimiert diese von Hand auf das Maximum</p>
</blockquote>
<p>Und wenn du ein ineffizientes Design gewählt hast?<br />
Oder bestimmte Algorithmen/Methoden, die langsam sind, und von denen die Struktur deines Programmes abhängt?</p>
<p>Ich denke, die Faustregel ist doch, all das, was austauschbar ist, nicht im Vorfeld zu optimieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2354914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2354914</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 23 Sep 2013 14:25:18 GMT</pubDate></item><item><title><![CDATA[Reply to optimaler Arrayzugriff? on Mon, 23 Sep 2013 18:41:50 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<blockquote>
<p>bestimmt man mit dem Profiler die Engpässe und optimiert diese von Hand auf das Maximum</p>
</blockquote>
<p>Und wenn du ein ineffizientes Design gewählt hast?</p>
</blockquote>
<p>Effizientes Design gehört zur Grundlage des Programms und nicht zur abschließenden Optimierung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2354997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2354997</guid><dc:creator><![CDATA[Marthog]]></dc:creator><pubDate>Mon, 23 Sep 2013 18:41:50 GMT</pubDate></item><item><title><![CDATA[Reply to optimaler Arrayzugriff? on Mon, 23 Sep 2013 18:49:16 GMT]]></title><description><![CDATA[<p>Marthog schrieb:</p>
<blockquote>
<p>Effizientes Design gehört zur Grundlage des Programms</p>
</blockquote>
<p>Wo kommt jetzt auf einmal diese Ausnahme her? Du hast geschrieben</p>
<blockquote>
<p><em>Im Allgemeinen</em> gilt aber, dass <em>der gesamt Code</em> erstmal so übersichtlich wie möglich geschrieben wird</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /></p>
<blockquote>
<p>Nö, das ist mir zu stark.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2355004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355004</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 23 Sep 2013 18:49:16 GMT</pubDate></item><item><title><![CDATA[Reply to optimaler Arrayzugriff? on Mon, 23 Sep 2013 18:52:00 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Wo kommt jetzt auf einmal diese Ausnahme her? Du hast geschrieben</p>
<blockquote>
<p><em>Im Allgemeinen</em> gilt aber, dass <em>der gesamt Code</em> erstmal so übersichtlich wie möglich geschrieben wird</p>
</blockquote>
</blockquote>
<p>Ich finde die Aussage von Marthog absolut korrekt.</p>
<p>Im Allgemeinen gilt:<br />
- Das Design so effizient wie möglich<br />
- Die Implementation so kurz/einfach wie möglich<br />
- Im Profiler nachgewiesene Engpässe optimieren</p>
<p>(Natürlich im Allgemeinen, manchmal lohnt sich schon im Voraus zu micro-optimieren, manchmal ist auch ein effizientes Design schnuppe)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355009</guid><dc:creator><![CDATA[codee]]></dc:creator><pubDate>Mon, 23 Sep 2013 18:52:00 GMT</pubDate></item><item><title><![CDATA[Reply to optimaler Arrayzugriff? on Mon, 23 Sep 2013 18:57:40 GMT]]></title><description><![CDATA[<p>codee schrieb:</p>
<blockquote>
<p>Im Allgemeinen gilt:<br />
- Das Design so effizient wie möglich<br />
- Die Implementation so kurz/einfach wie möglich<br />
- Im Profiler nachgewiesene Engpässe optimieren</p>
</blockquote>
<p>Die Punkte widersprechen sich aber. Es geht nicht um Mikrooptimierungen (Ja, die Ausgangsfrage war eine Frage nach einer Mikrooptimierung, aber das ist sicher nicht das, was volkard und Sone meinen). Das Design sollte von Anfang an so effizient wie möglich sein, wozu Überlegungen zählen, was überhaupt effizient ist. Dies zieht dann eventuell aber eine nicht ganz einfache Implementierung nach sich. Ein schlechtes Design kannst du mit dem Profiler so sehr optimieren wie du willst, es wird dadurch nicht gut, außer du veränderst es komplett. Wenn du am Ende alles komplett umschreiben musst, dann wünscht du dir, du hättest von vornherein an Effizienz gedacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355010</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355010</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 23 Sep 2013 18:57:40 GMT</pubDate></item><item><title><![CDATA[Reply to optimaler Arrayzugriff? on Mon, 23 Sep 2013 19:12:19 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Die Punkte widersprechen sich aber.</p>
</blockquote>
<p>Ein universeller Ratschlag ist immer widersprüchlich.</p>
<p>Es gibt aber Spielraum, was Design und was Implementation ist. Der Code in den Funktionen kann Implementation sein. Die Wahl des Algorithmus kann Implementation sein. Der ganze Parser (z.B.) kann Implementation sein. Die Strukturen zum Datenaustausch sollten generisch genug sein, mit verschiedenen Implementierungen ohne grobe Änderung klarzukommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355019</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355019</guid><dc:creator><![CDATA[codee]]></dc:creator><pubDate>Mon, 23 Sep 2013 19:12:19 GMT</pubDate></item><item><title><![CDATA[Reply to optimaler Arrayzugriff? on Mon, 23 Sep 2013 19:14:44 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a><br />
Wenn man es verstehen will, dann ist da kein Widerspruch. Erfordert nichtmal irgendwelche geistigen Verrenkungen:</p>
<ol>
<li>Das Design so effizient wie möglich</li>
<li>Die Implementierung <em>dieses Designs</em> so kurz/einfach wie möglich (d.h. so einfach wie es geht ohne das effiziente Designs zu verändern)</li>
<li>Im Profiler nachgewiesene Engpässe optimieren</li>
</ol>
<p>Damit es sinnvoll bleibt setzt das natürlich vorauss dass das &quot;Design&quot; relativ high-level ist, und keine sinnlosen, voreiligen und aufwendigen Optimierungen vorsieht/erfordert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355022</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 23 Sep 2013 19:14:44 GMT</pubDate></item><item><title><![CDATA[Reply to optimaler Arrayzugriff? on Mon, 23 Sep 2013 19:18:19 GMT]]></title><description><![CDATA[<p>codee schrieb:</p>
<blockquote>
<p>Es gibt aber Spielraum, was Design und was Implementation ist. Der Code in den Funktionen kann Implementation sein. Die Wahl des Algorithmus kann Implementation sein. Der ganze Parser (z.B.) kann Implementation sein. Die Strukturen zum Datenaustausch sollten generisch genug sein, mit verschiedenen Implementierungen ohne grobe Änderung klarzukommen.</p>
</blockquote>
<p>Das ist ein richtiger, aber sehr allgemeiner Vorschlag. Aber von immer nur Abstrahieren passiert nichts. Irgendwann muss man konkret werden und Code schreiben, der auch wirklich etwas tut. Dann kann und sollte man auch mal im Voraus nachdenken, wie eine gute Implementierung aussieht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355024</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 23 Sep 2013 19:18:19 GMT</pubDate></item><item><title><![CDATA[Reply to optimaler Arrayzugriff? on Mon, 23 Sep 2013 19:36:07 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>codee schrieb:</p>
<blockquote>
<p>Es gibt aber Spielraum, was Design und was Implementation ist. Der Code in den Funktionen kann Implementation sein. Die Wahl des Algorithmus kann Implementation sein. Der ganze Parser (z.B.) kann Implementation sein. Die Strukturen zum Datenaustausch sollten generisch genug sein, mit verschiedenen Implementierungen ohne grobe Änderung klarzukommen.</p>
</blockquote>
<p>Das ist ein richtiger, aber sehr allgemeiner Vorschlag. Aber von immer nur Abstrahieren passiert nichts. Irgendwann muss man konkret werden und Code schreiben, der auch wirklich etwas tut. Dann kann und sollte man auch mal im Voraus nachdenken, wie eine gute Implementierung aussieht.</p>
</blockquote>
<p>Hab ich das missverständlich geschrieben? Implementation = Quick and dirty, Gegenteil von Abstraktion.</p>
<p>Abhängig vom Grad der Abstraktion ist halt mehr oder weniger kurz/einfach.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355029</guid><dc:creator><![CDATA[codee]]></dc:creator><pubDate>Mon, 23 Sep 2013 19:36:07 GMT</pubDate></item><item><title><![CDATA[Reply to optimaler Arrayzugriff? on Mon, 23 Sep 2013 19:37:27 GMT]]></title><description><![CDATA[<p>Performance ist nicht orthogonal zum restlichen Design und muss bei der Planung des Programms beruecksichtigt werden. Gegebene Mikrooptimierung faellt aber nicht in diesen Bereich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355031</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355031</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 23 Sep 2013 19:37:27 GMT</pubDate></item></channel></rss>