<?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[for-Optimierung]]></title><description><![CDATA[<p>Hallo,<br />
macht ein Compiler mit Release-Optionen aus sowas</p>
<pre><code class="language-cpp">for (int n = 0; n &lt; foo(); ++n)
</code></pre>
<p>dieses hier</p>
<pre><code class="language-cpp">int foo_bla = foo();
for (int n = 0; n &lt; foo_bla; ++n)
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/308431/for-optimierung</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 18:05:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/308431.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 25 Sep 2012 01:13:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 01:13:21 GMT]]></title><description><![CDATA[<p>Hallo,<br />
macht ein Compiler mit Release-Optionen aus sowas</p>
<pre><code class="language-cpp">for (int n = 0; n &lt; foo(); ++n)
</code></pre>
<p>dieses hier</p>
<pre><code class="language-cpp">int foo_bla = foo();
for (int n = 0; n &lt; foo_bla; ++n)
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254119</guid><dc:creator><![CDATA[Wurstinator]]></dc:creator><pubDate>Tue, 25 Sep 2012 01:13:21 GMT</pubDate></item><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 01:19:47 GMT]]></title><description><![CDATA[<p>Wenn er sieht, dass foo() immer das Gleiche zurückgibt, sehr wahrscheinlich, ja. Bitte aber auch bedenken, dass das hier wesentlich schneller ist, falls die Reihenfolge nicht wichtig ist:</p>
<pre><code class="language-cpp">for (auto i = foo(); i-- != 0; )
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2254120</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254120</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 25 Sep 2012 01:19:47 GMT</pubDate></item><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 01:20:27 GMT]]></title><description><![CDATA[<p>nur wenn du ihn lieb bittest^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254121</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254121</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Tue, 25 Sep 2012 01:20:27 GMT</pubDate></item><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 01:22:16 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Wenn er sieht, dass foo() immer das Gleiche zurückgibt, sehr wahrscheinlich, ja. Bitte aber auch bedenken, dass das hier wesentlich schneller ist, falls die Reihenfolge nicht wichtig ist:</p>
<pre><code class="language-cpp">for (auto i = foo(); i-- != 0; )
</code></pre>
</blockquote>
<p>das ist nice, muss ich mir merken!(sorry für den doppelpost)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254122</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Tue, 25 Sep 2012 01:22:16 GMT</pubDate></item><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 02:44:40 GMT]]></title><description><![CDATA[<p>Namenloser324 schrieb:</p>
<blockquote>
<p>cooky451 schrieb:</p>
<blockquote>
<p>Wenn er sieht, dass foo() immer das Gleiche zurückgibt, sehr wahrscheinlich, ja. Bitte aber auch bedenken, dass das hier wesentlich schneller ist, falls die Reihenfolge nicht wichtig ist:</p>
<pre><code class="language-cpp">for (auto i = foo(); i-- != 0; )
</code></pre>
</blockquote>
<p>das ist nice, muss ich mir merken!(sorry für den doppelpost)</p>
</blockquote>
<p>Merk dir es, aber verwende es sogut wie nie. Man sollte immer gut lesbaren Code vorziehen. Außerdem ist es ganz sicher nicht <strong>wesentlich</strong> schneller. Zu 90% ist die Schleife für Performance sowieso unwichtig.<br />
<a href="http://en.wikipedia.org/wiki/Program_optimization#Bottlenecks" rel="nofollow">http://en.wikipedia.org/wiki/Program_optimization#Bottlenecks</a></p>
<blockquote>
<p>In computer science, the Pareto principle can be applied to resource optimization by observing that 80% of the resources are typically used by 20% of the operations. In software engineering, it is often a better approximation that 90% of the execution time of a computer program is spent executing 10% of the code (known as the 90/10 law in this context).</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2254124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254124</guid><dc:creator><![CDATA[mkmk]]></dc:creator><pubDate>Tue, 25 Sep 2012 02:44:40 GMT</pubDate></item><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 03:16:36 GMT]]></title><description><![CDATA[<p>In welcher Hinsicht ist das bitte nicht gut lesbar? Oo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254125</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254125</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 25 Sep 2012 03:16:36 GMT</pubDate></item><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 05:36:16 GMT]]></title><description><![CDATA[<p>Also ich würde mich auch genötigt fühlen, dieses Konstrukt länger zu durchdenken und danach einen Kommentar drüber zu schreiben und _danach_ die Schleife durch die lesbar Variante zu ersetzen.</p>
<p>//edit es ist nichtmal klar, ob der Compiler checkt was du machen willst. Im worst case ist er verwirrt und schaltet dir erstmal SSE aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254133</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Tue, 25 Sep 2012 05:36:16 GMT</pubDate></item><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 05:49:49 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>Also ich würde mich auch genötigt fühlen, dieses Konstrukt länger zu durchdenken und danach einen Kommentar drüber zu schreiben und _danach_ die Schleife durch die lesbar Variante zu ersetzen.</p>
</blockquote>
<p>Aua.</p>
<p>otze schrieb:</p>
<blockquote>
<p>//edit es ist nichtmal klar, ob der Compiler checkt was du machen willst. Im worst case ist er verwirrt und schaltet dir erstmal SSE aus.</p>
</blockquote>
<p>Bitte was? Natürlich rafft der das. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254136</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 25 Sep 2012 05:49:49 GMT</pubDate></item><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 06:05:16 GMT]]></title><description><![CDATA[<p>Warum Aua? Dieses Konstrukt ist so unnnatürlich, dass ich erstmal analysiere, ob es überhaupt einen Sinn hat, rückwärts zu iterieren. Das kostet mich im Zweifelsfall, je nach Codekenntnis, 10-30 Minuten, bevor ich daran weiter arbeiten kann. Das ist genauso, wie bei Leuten, die ihre Laufvariablen vor dem Loop deklarieren wo ich den ganzen Folgecode durchsuche, ob der Wert der Variablen noch irgendwo benutzt wird.</p>
<p>An so ein Konstrukt gehört ein Kommentar. Mit Begründung(also Benchmark).</p>
<p>Und zu dem Zweiten Teil: das hast du natürlich getestet? Ich habe da nicht mehr so viel Vertrauen in meine Compiler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254138</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Tue, 25 Sep 2012 06:05:16 GMT</pubDate></item><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 06:18:11 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>Warum Aua? Dieses Konstrukt ist so unnnatürlich,</p>
</blockquote>
<p>What? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> Ich benutze das in etwa 10 mal öfter als das &quot;normale&quot; Konstrukt, und offen gesagt finde ich es wesentlich leichter zu lesen. Ich bevorzuge es auch, wenn Performance garkeine Rolle spielt.</p>
<p>otze schrieb:</p>
<blockquote>
<p>dass ich erstmal analysiere, ob es überhaupt einen Sinn hat, rückwärts zu iterieren. Das kostet mich im Zweifelsfall, je nach Codekenntnis, 10-30 Minuten, bevor ich daran weiter arbeiten kann.</p>
</blockquote>
<p>Wie lang sind denn deine Schleifen, dass man da 10 Minuten dran lesen kann?</p>
<p>otze schrieb:</p>
<blockquote>
<p>Das ist genauso, wie bei Leuten, die ihre Laufvariablen vor dem Loop deklarieren wo ich den ganzen Folgecode durchsuche, ob der Wert der Variablen noch irgendwo benutzt wird.</p>
</blockquote>
<p>Wenn das ernsthaft ein relevanter Zeitfaktor ist kann man den Code eh gleich in die Tonne kloppen, weil der Gültigkeitsbereich offensichtlich zu groß ist.</p>
<p>otze schrieb:</p>
<blockquote>
<p>An so ein Konstrukt gehört ein Kommentar. Mit Begründung(also Benchmark).</p>
</blockquote>
<p>Ich denke sowas ist Allgemeinwissen, ich schreib' ja auch nicht bei jedem std::transform daneben dass die Reihenfolge nicht garantiert ist.</p>
<p>otze schrieb:</p>
<blockquote>
<p>Und zu dem Zweiten Teil: das hast du natürlich getestet? Ich habe da nicht mehr so viel Vertrauen in meine Compiler.</p>
</blockquote>
<p>Klar habe ich das getestet. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2254142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254142</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 25 Sep 2012 06:18:11 GMT</pubDate></item><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 06:26:14 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>otze schrieb:</p>
<blockquote>
<p>Warum Aua? Dieses Konstrukt ist so unnnatürlich,</p>
</blockquote>
<p>What? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> Ich benutze das in etwa 10 mal öfter als das &quot;normale&quot; Konstrukt, und offen gesagt finde ich es wesentlich leichter zu lesen. Ich bevorzuge es auch, wenn Performance garkeine Rolle spielt.</p>
</blockquote>
<p>Das ist relativ untypisch. Was sagen deine Kollegen dazu, für wie lesbar halten sie den Code? Wenn man nicht gerade für sich selbst entwickelt ist Lesbarkeit das oberste Gebot - und da spielen Konventionen eine wichtige Rolle, denen dein Konstrukt nicht so recht entspricht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254145</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 25 Sep 2012 06:26:14 GMT</pubDate></item><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 06:30:23 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>otze schrieb:</p>
<blockquote>
<p>dass ich erstmal analysiere, ob es überhaupt einen Sinn hat, rückwärts zu iterieren. Das kostet mich im Zweifelsfall, je nach Codekenntnis, 10-30 Minuten, bevor ich daran weiter arbeiten kann.</p>
</blockquote>
<p>Wie lang sind denn deine Schleifen, dass man da 10 Minuten dran lesen kann?</p>
</blockquote>
<p>Man weiß beim unkommentieren Code nicht, ob dieses Konstrukt eine (i.d.R. nutzlose) Performanceoptimierung ist, oder ob die Iteration rückwärts einen semantischen Zweck erfüllt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254146</guid><dc:creator><![CDATA[qwertfdassffds]]></dc:creator><pubDate>Tue, 25 Sep 2012 06:30:23 GMT</pubDate></item><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 06:46:44 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Das ist relativ untypisch. Was sagen deine Kollegen dazu, für wie lesbar halten sie den Code? Wenn man nicht gerade für sich selbst entwickelt ist Lesbarkeit das oberste Gebot - und da spielen Konventionen eine wichtige Rolle, denen dein Konstrukt nicht so recht entspricht.</p>
</blockquote>
<p>Nicht, dass ich Arbeitskollegen hätte als fast Student, aber die Leute, die ich kenne, hätten damit keine Probleme. Ich verstehe offen gesagt auch nicht so ganz, was daran schwer zu lesen sein soll. Es ist eine Zeile Code, auch wenn ich die noch nie gesehen habe, kann ich in etwa so schnell erfassen was die macht wie ich lesen kann? <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="😕"
    /></p>
<p>qwertfdassffds schrieb:</p>
<blockquote>
<p>Man weiß beim unkommentieren Code nicht, ob dieses Konstrukt eine (i.d.R. nutzlose) Performanceoptimierung ist, oder ob die Iteration rückwärts einen semantischen Zweck erfüllt.</p>
</blockquote>
<p>Das ist kein Argument dafür per &quot;default&quot; die langsamere Variante zu wählen. Ich weiß bei unkommentiertem Code nicht, ob das vorwärts Iterieren einen semantischen Zweck erfüllt, oder ob man das optimieren kann. Deshalb schreibe ich überall da, wo es einen Zweck erfüllt, ein Kommentar, und überall wo es egal ist, eben halt keinen. Würde anders ja auch wenig Sinn machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254150</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 25 Sep 2012 06:46:44 GMT</pubDate></item><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 07:19:59 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Es ist eine Zeile Code, auch wenn ich die noch nie gesehen habe, kann ich in etwa so schnell erfassen was die macht wie ich lesen kann? <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="😕"
    /></p>
</blockquote>
<p>Nein, eben nicht. Stell dir vor, du bist im Straßenverkehr. Du siehst ein quadratisches, türkisfarbenes Schild an einer Kreuzung, auf dem fett STOP steht. Du weißt, nachdem du es dir angeschaut hast und den Text <em>gelesen</em> hast, was gemeint ist. Wunderst dich aber, warum es nicht das übliche, rote Stop-Schild ist, bei dem du nichtmal mehr richtig liest, sondern in einem Sekundenbruchteil erfasst, welches Schild du vor dir hast (selbst, wenn es auf <a href="http://us.123rf.com/400wm/400/400/kasto/kasto1102/kasto110200063/8990920-arabische-rote-und-weisse-verkehr-stop-schild.jpg" rel="nofollow">arabisch</a> ist).</p>
<p>Das gleiche passiert beim Lesen des Quelltextes. Über das typische <code>for(int i = 0; bla bla...)</code> huscht jeder kurz drüber, ohne die Konzentration auf die wesentlichen Aspekte des Quelltextes zu ignorieren. Bei deinem Rückwärtskonstrukt muss man erstmal anhalten und genau nachlesen, was gemeint ist. Natürlich geht das ziemlich fix, trotzdem stört es den Lesefluss, vor Allem wenn man sich fragt, wo der Haken ist, und warum du nicht die übliche Version genommen hast. Man analysiert das Ganze nochmal und stellt fest, dass es keinen unterschied gibt, trotzdem ist es ein Stolperstein. Man verliert das Wesentliche aus dem Fokus, völlig unnötigerweise. Code, der mit solchen unüblichen Konstrukten durchsetzt ist, liest sich genauso holperig wie ein text, der in einem ungewöhnlichen, unflüssigen Text geschrieben wurde. Man kanns lesen, es ist aber sicher keine Freude.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254151</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 25 Sep 2012 07:19:59 GMT</pubDate></item><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 07:06:41 GMT]]></title><description><![CDATA[<p>Nun, der Standard ist eben das vorwärts iterieren. Das hat man gelernt, das nutzt man im Regelfall und das ist man auch gewohnt in fremden Codes zu sehen. Findest Du es nicht nachvollziehbar, dass jemand in Deinen Code schaut und sich deswegen überlegt (wieso HIER rückwärts, wieso bricht er mit dem, was man normalerweise macht?). Auch in einer kurzen Schleife mit einer Funktion, die über eine Bildschirmseite gibt, kann das natürlich je nach Aufrufstack-Tiefe und iteriertem Objekt ein komplexer Code sein, über den man dann doch Mal genau nachdenkt.</p>
<p>Auch wenn Du den Code ohne Performance-Gewinn vorziehen würdest: die meisten schreiben es nicht so, daher ist es erstmal unüblich und somit verwirrender. Und Verwirrung steht guter Lesbarkeit quasi gegenüber.</p>
<p>Edit: Bis hier hat das pumuckl viel cooler erklärt.</p>
<p>Und dann würde mich Dein Benchmark-Programm interessieren, das zeigt, dass die Variante performanter ist. Hast Du die zufällig gerade zur Hand?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254153</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Tue, 25 Sep 2012 07:06:41 GMT</pubDate></item><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 07:21:03 GMT]]></title><description><![CDATA[<p>Hmja, aber wenn man's 3 mal gelesen hat ist es genau so drin wie die andere Variante. Und selbst wenn man völlig verwirrt ist und aus dem Konzept kommt verliert man so höchstens 3 mal eine Minute, das ist es definitiv wert.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22559">@Eisflamme</a><br />
Ja, er wäre beim ersten mal verwirrt. Vielleicht beim zweiten mal. Danach ist es aber egal. Ich bin andererseits offen gesagt eher geschockt, dass das nicht alle so machen. Ich muss immer schon schmunzeln wenn ich die andere Variante sehe wo es doch offensichtlich ist, dass es auch rückwärts ginge.</p>
<p>Ich hab' mal nen relativ aufwendigen Benchmark geschrieben mit Matrizen etc., den finde ich allerdings gerade nicht. Aber ich hab hier mal kurz was zusammengefrickelt. (Hoffentlich ohne Fehler.)</p>
<pre><code class="language-cpp">#include &lt;chrono&gt;
#include &lt;vector&gt;
#include &lt;iostream&gt;

template &lt;typename Clock = std::chrono::steady_clock&gt;
class stopwatch
{
	typename Clock::time_point last_;

public:
	stopwatch()
		: last_(Clock::now())
	{}

	void reset()
	{
		*this = stopwatch();
	}

	typename Clock::duration elapsed() const
	{
		return Clock::now() - last_;
	}

	typename Clock::duration tick()
	{
		auto now = Clock::now();
		auto elapsed = now - last_;
		last_ = now;
		return elapsed;
	}
};

template &lt;typename T, typename Rep, typename Period&gt;
T duration_cast(const std::chrono::duration&lt;Rep, Period&gt;&amp; duration)
{
	return duration.count() * static_cast&lt;T&gt;(Period::num) / static_cast&lt;T&gt;(Period::den);
}

void foo(std::vector&lt;char&gt;&amp; v)
{
	stopwatch&lt;&gt; timer;
	for (int i = v.size(); i-- != 0; )
		v[i] = 77;
	std::cout &lt;&lt; &quot;Foo time: &quot; &lt;&lt; duration_cast&lt;float&gt;(timer.elapsed()) &lt;&lt; '\n';
}

void bar(std::vector&lt;char&gt;&amp; v)
{
	stopwatch&lt;&gt; timer;
	for (int i = 0; i != v.size(); ++i)
		v[i] = 44;
	std::cout &lt;&lt; &quot;Bar time: &quot; &lt;&lt; duration_cast&lt;float&gt;(timer.elapsed()) &lt;&lt; '\n';
}

int main()
{
	std::size_t n;
	std::cin &gt;&gt; n;
	std::vector&lt;char&gt; v(n * 1024 * 1024);
	foo(v);
	bar(v);
}
</code></pre>
<p>Am besten ein paar mal hintereinander laufen lassen, damit der RAM vorbereitet ist. n zwischen 512 und 1024 sollte gute Ergebnisse bringen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254154</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 25 Sep 2012 07:21:03 GMT</pubDate></item><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 07:20:24 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">for (auto i = foo(); i-- != 0; )
</code></pre>
</blockquote>
<p>Wenn foo einen vorzeichenlosen Typen zurückgibt, hast du eine Endlosschleife. So viel zum Thema &quot;gut lesbar&quot;.</p>
<p>Edit: Gilt natürlich nur, wenn du deinen Code erst mal auf das anpasst, was der OP geschrieben hat, nämlich eine Iteration von 0 bis foo() -1 und nicht wie bei dir eine Iteration von 1 bis foo(). Also gleich zwei Fehler in &quot;so einem einfachen Code&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254157</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Tue, 25 Sep 2012 07:20:24 GMT</pubDate></item><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 07:17:08 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>cooky451 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">for (auto i = foo(); i-- != 0; )
</code></pre>
</blockquote>
<p>Wenn foo einen vorzeichenlosen Typen zurückgibt, hast du eine Endlosschleife. So viel zum Thema &quot;gut lesbar&quot;.</p>
</blockquote>
<p>Falsch. Wird der zweite Satz dadurch richtiger?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254158</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 25 Sep 2012 07:17:08 GMT</pubDate></item><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 07:18:07 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>cooky451 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">for (auto i = foo(); i-- != 0; )
</code></pre>
</blockquote>
<p>Wenn foo einen vorzeichenlosen Typen zurückgibt, hast du eine Endlosschleife. So viel zum Thema &quot;gut lesbar&quot;.</p>
</blockquote>
<p>Dein Kommentar zeigt wirklich Mängel in der Lesbarkeit auf, aber anders als Du denkst...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254159</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254159</guid><dc:creator><![CDATA[!= != &amp;gt;=]]></dc:creator><pubDate>Tue, 25 Sep 2012 07:18:07 GMT</pubDate></item><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 07:21:51 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Falsch. Wird der zweite Satz dadurch richtiger?</p>
</blockquote>
<p>Siehe Edit:</p>
<blockquote>
<p>Edit: Gilt natürlich nur, wenn du deinen Code erst mal auf das anpasst, was der OP geschrieben hat, nämlich eine Iteration von 0 bis foo() -1 und nicht wie bei dir eine Iteration von 1 bis foo(). Also gleich zwei Fehler in &quot;so einem einfachen Code&quot;.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2254160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254160</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Tue, 25 Sep 2012 07:21:51 GMT</pubDate></item><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 07:23:14 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Edit: Gilt natürlich nur, wenn du deinen Code erst mal auf das anpasst, was der OP geschrieben hat, nämlich eine Iteration von 0 bis foo() -1 und nicht wie bei dir eine Iteration von 1 bis foo(). Also gleich zwei Fehler in &quot;so einem einfachen Code&quot;.</p>
</blockquote>
<p>Langsam wird's lustig. <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="😃"
    /> Aber dafür verstehe ich etwas mehr was pumuckl meint.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254161</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 25 Sep 2012 07:23:14 GMT</pubDate></item><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 07:29:12 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>[..] Wie lang sind denn deine Schleifen, dass man da 10 Minuten dran lesen kann?<br />
[...] Wenn das ernsthaft ein relevanter Zeitfaktor ist kann man den Code eh gleich in die Tonne kloppen, weil der Gültigkeitsbereich offensichtlich zu groß ist.</p>
</blockquote>
<p>Ich arbeite hier mit zum Teil 15 Jahre alten open source code der von Wissenschaftlern und Studenten geschrieben wurde. Was meinst du, ist die durchschnittliche Codequalität? Natürlich wandert der Code in die Tonne, den neu zu schreiben ist gerade mein Job. Aber dafür muss ich erstmal verstehen was er macht. Und ich habe das Gefühl, dass es so kleine Abweichungen von der Konvention sind, die am meisten Zeit fressen.</p>
<p>Es gibt ja noch eine andere Konvention, die in einer zeitrelevanten Schleife eingesetzt werden kann:</p>
<pre><code class="language-cpp">std::size_t end = funct();
for(std::size_t i = 0; i != end; ++i){...}
</code></pre>
<p>kostet mich im durchschnitt 2 Sekunden zu verstehen. wenn ich nun das mit deiner Variante vergleiche stellt sich natürlich wiederholt die Frage, ob da nicht doch noch irgendwas passiert, immerhin hättest du die Schlife auch wie oben schreiben können.</p>
<p>//edit meine Tastatur liegt im persönlichen Krieg mit dem &quot;e&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254162</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Tue, 25 Sep 2012 07:29:12 GMT</pubDate></item><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 07:28:47 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Langsam wird's lustig. <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="😃"
    /> Aber dafür verstehe ich etwas mehr was pumuckl meint.</p>
</blockquote>
<p>Was ist so lustig? Ein typischer realer Ersatz von foo wäre vector::size(). Was passiert hier?</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;iostream&gt;
using namespace std;

int main()
{
        vector&lt;int&gt; foo(2, 0);
        for(auto i = foo.size(); i &gt;= 0; --i)
        {
                cout &lt;&lt; i &lt;&lt; endl;
                if(i &gt; 1000) break;
        }
}
</code></pre>
<p>Ausgabe:</p>
<pre><code>2
1
0
4294967295
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2254163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254163</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Tue, 25 Sep 2012 07:28:47 GMT</pubDate></item><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 07:33:32 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Was ist so lustig? Ein typischer realer Ersatz von foo wäre vector::size(). Was passiert hier?</p>
</blockquote>
<p>Wenn du noch ein bisschen überlegst und dir den Code anguckst den ich gepostet habe, wirst du verstehen warum das lustig ist. <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 />
Tipp: Die von dir geschriebene Schleife ist zu meiner grundverschieden.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/5202">@otze</a><br />
Also ich weis nicht. Mir sind die ganzen Varianten alle gleich geläufig, und offen gesagt ist mir völlig egal was davon man benutzt, ich kann das alles gleich gut lesen. Und per default die langsamere Variante zu benutzen leuchtet mir einfach nicht ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254165</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254165</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 25 Sep 2012 07:33:32 GMT</pubDate></item><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 07:38:09 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Und selbst wenn man völlig verwirrt ist und aus dem Konzept kommt verliert man so höchstens 3 mal eine Minute, das ist es definitiv wert.</p>
</blockquote>
<p>Ist es das? Zwei parallele Konventionen, für Schleifen, die nur dann semantisch gleichwertig sind, wenn die Reihenfolge keine Rolle spielt. Und als Ergebnis kriegen wir eine schnellere Ausführung des Schleifenkopfes (wie viel schneller eigentlich?), dessen Performanceimpakt vielleicht in einem von hundert Fällen wirklich was ausmacht (wenn überhaupt). Richtig auszahlen wird sich sowas vermutlich nur, wenn man Schleifen über riesige Bereiche hat (Numerik, Bildverarbeitung, ...?), deren Schleifenrümpfe nur sehr wenig Zeit benötigen (sonst fällt der Schleifenkopf prozentual nicht ins Gewicht und man sollte eher an der Anzahl der Iterationen schrauben). Vielleicht abgesehen von besagten speziellen Bereichen, wo solche Schleifen häufig vorkomemn, sehe ich da keinerlei Gewinn. Oder anders gesagt: Dem Ottonormalentwickler kommt nur höchst selten ein Fall unter, wo das Konstrukt eine messbare Optimierung darstellt. Das als allgemeinen Standard zu propagieren, der keines Kommentars bedarf, ist absurd. Wenn du in einem Projekt arbeitest, in dem ein großer Teil der Schleifen davon profitieren, dann machs im Projekt zum Standard. Ich bin zufälligerweise mit der Performanceoptimierung in einem Projekt vertraut, in dem viele Schleifen vorkommen, bei denen Reihenfolge keine Rolle spielt (aktuarieller Rechenkern für Lebensversicherungssoftware). Auch solche Schleifenoptimierungen sind dort schon erwägt worden, weil Performance hier wirklich eine Rolle spielt. Es bringt nur kein Ergebnis, das die Aufwände für eine entsprechende Umstellung rechtfertigen würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2254168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254168</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 25 Sep 2012 07:38:09 GMT</pubDate></item><item><title><![CDATA[Reply to for-Optimierung on Tue, 25 Sep 2012 07:38:22 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Am besten ein paar mal hintereinander laufen lassen, damit der RAM vorbereitet ist. n zwischen 512 und 1024 sollte gute Ergebnisse bringen.</p>
</blockquote>
<p>.. und wie sind die Ergebnisse?</p>
<p>Mein Benschmark liefert folgendes:</p>
<pre><code>klassisch
5000000 0s
dekrementierend
5000000 0.0179735s
abgefahren
5000000 0.0135209s
</code></pre>
<p>interessanterweise ist selbst die Variante mit counting_iterator (s.u.) und Algorithmus geringfügig schneller als die dekrementierende Variante</p>
<p>und hier ist der Code dazu</p>
<pre><code class="language-cpp">int foo() { return 1000*(2000 + 8000); }

int main()
{
    using namespace std;
    Watch uhr;
    {
        cout &lt;&lt; &quot;klassisch&quot; &lt;&lt; endl;
        Watch::Stopper stopper( uhr );
        int counter = 0;
        int bla = foo();
        for( int i=0; i&lt;bla; ++i )
            counter += i % 2? +i: -i;
        cout &lt;&lt; counter &lt;&lt; &quot; &quot; &lt;&lt; uhr &lt;&lt; endl;
    }
    {
        cout &lt;&lt; &quot;dekrementierend&quot; &lt;&lt; endl;
        Watch::Stopper stopper( uhr );
        int counter = 0;
        for( int i=foo(); i-- != 0; )
            counter += i % 2? +i: -i;
        cout &lt;&lt; counter &lt;&lt; &quot; &quot; &lt;&lt; uhr &lt;&lt; endl;
    }
    {
        cout &lt;&lt; &quot;abgefahren&quot; &lt;&lt; endl;
        Watch::Stopper stopper( uhr );
        int counter = 0;
        for_each( boost::counting_iterator&lt; int &gt;(0), boost::counting_iterator&lt; int &gt;(foo()), [&amp;counter]( int i ) { counter += i % 2? +i: -i; } );
        cout &lt;&lt; counter &lt;&lt; &quot; &quot; &lt;&lt; uhr &lt;&lt; endl;
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2254169</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2254169</guid><dc:creator><![CDATA[Werner_logoff]]></dc:creator><pubDate>Tue, 25 Sep 2012 07:38:22 GMT</pubDate></item></channel></rss>