<?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++ Performance]]></title><description><![CDATA[<p>Was sind eigentlich die Tricks, dass C++ so schnell ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/220501/c-performance</link><generator>RSS for Node</generator><lastBuildDate>Wed, 07 Oct 2026 02:01:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/220501.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 17 Aug 2008 06:58:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to C++ Performance on Sun, 17 Aug 2008 06:58:58 GMT]]></title><description><![CDATA[<p>Was sind eigentlich die Tricks, dass C++ so schnell ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1566255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1566255</guid><dc:creator><![CDATA[Javaspion]]></dc:creator><pubDate>Sun, 17 Aug 2008 06:58:58 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Performance on Sun, 17 Aug 2008 07:10:35 GMT]]></title><description><![CDATA[<p>der geschreibene code wird in ziemlich gut in maschinencode gewandelt (C/C++ ist sehr systemnah)<br />
und der maschinencode wird optimiert bis zum geht nicht mehr<br />
variablen werden wegoptimiert, beid er compilation wird schon viel ausgerechnet</p>
<p>aus folgendem beispiel:</p>
<pre><code class="language-cpp">int n = 5;
int erg = 0, i = 0;
for(i = 0; i &lt; n; ++i)
   erg += i;
</code></pre>
<p>macht der compiler ungefähr sowas hier:</p>
<pre><code class="language-cpp">int n = 5;
int erg = (n*(n+1))/2;
</code></pre>
<p>und siehe da, i ist komplett weg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1566256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1566256</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sun, 17 Aug 2008 07:10:35 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Performance on Sun, 17 Aug 2008 08:51:44 GMT]]></title><description><![CDATA[<p>Javaspion schrieb:</p>
<blockquote>
<p>Was sind eigentlich die Tricks, dass C++ so schnell ist?</p>
</blockquote>
<p>das zero-cost-principle.</p>
<p>man zahlt nur performance kosten wenn man es braucht - wenn ich etwas nicht brauche kostet es mich keine performance.</p>
<p>beispiel: speicher allokationen. ich kann alles auf den stack legen was praktisch gesehen nur eine pointer addition an zeit kostet.</p>
<p>oder in java ist jedes objekt ja lock-able und implementiert noch dazu das observer pattern um mit den anderen objekten kommunizieren zu koennen die gelockt sind. ob man das nun braucht oder nicht. in c++ gibt es soetwas nicht.</p>
<p>selbes prinzip wird bei nahezu allen sprachfeatures verwendet - so dass man nur einen bruchteil der performance kosten von anderen sprachen zahlen muss.</p>
<p>und natuerlich gibt es metaprogrammierung um statisch code zu generieren (und nichts ist schneller als code der nicht ausgefuehrt werden muss da er vorher schon berechnet wurde) und type_traits ermoeglichen es statisch die besten algorithmen fuer die jeweiligen datentypen zu verwenden.</p>
<p>das bedeutet aber auch einen gewissen mehraufwand den man als programmierer taetigen muss um diese features zu nutzen. das zero-cost-principle dagegen bekommt man ohne aufwand.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1566293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1566293</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Sun, 17 Aug 2008 08:51:44 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Performance on Sun, 17 Aug 2008 09:45:56 GMT]]></title><description><![CDATA[<p>wobei aktuelle java compiler auch schon gewaltig optimieren. und die JIT compiler diverser VMs optimieren dann noch mehr weg, so dass im endeffekt u.u. sogar derselbe maschinencode ausgeführt wird, wie bei einem c/c++ programm.<br />
also kurz gefasst: die hohe performance einer sprache kommt durch die optimierungsfähigkeiten des compilers zustande. und traditionsgemäß sind da die &quot;reinen&quot; c++ compiler am besten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1566308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1566308</guid><dc:creator><![CDATA[javabanana]]></dc:creator><pubDate>Sun, 17 Aug 2008 09:45:56 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Performance on Sun, 17 Aug 2008 16:40:55 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>der geschreibene code wird in ziemlich gut in maschinencode gewandelt (C/C++ ist sehr systemnah)<br />
und der maschinencode wird optimiert bis zum geht nicht mehr<br />
variablen werden wegoptimiert, beid er compilation wird schon viel ausgerechnet</p>
<p>aus folgendem beispiel:</p>
<pre><code class="language-cpp">int n = 5;
int erg = 0, i = 0;
for(i = 0; i &lt; n; ++i)
   erg += i;
</code></pre>
<p>macht der compiler ungefähr sowas hier:</p>
<pre><code class="language-cpp">int n = 5;
int erg = (n*(n+1))/2;
</code></pre>
<p>und siehe da, i ist komplett weg</p>
</blockquote>
<p>das glaub ich nicht... mal abgesehen davon, dass beide Programme unterschiedliche Ergebnisse liefern (Deine Schleife müßte bis n laufen, nicht bis n-1) glaube ich nicht, dass es Compiler gibt, die das erkennen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1566503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1566503</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Sun, 17 Aug 2008 16:40:55 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Performance on Sun, 17 Aug 2008 16:51:25 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">int main(int argc, char** argv) {
	int n = 5;
	int erg = 0, i = 0;
	for(i = 0; i &lt; n; ++i)
	   erg += i; 

	std::cout&lt;&lt;erg;
}
</code></pre>
<pre><code class="language-asm">;	COMDAT _main
_TEXT	SEGMENT
_argc$ = 8						; size = 4
_argv$ = 12						; size = 4
_main	PROC						; COMDAT

; 28   : 	int n = 5;
; 29   : 	int erg = 0, i = 0;
; 30   : 	for(i = 0; i &lt; n; ++i)
; 31   : 	   erg += i; 
; 32   : 
; 33   : 	std::cout&lt;&lt;erg;

  00000	8b 0d 00 00 00
	00		 mov	 ecx, DWORD PTR __imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A
  00006	6a 0a		 push	 10			; 0000000aH
  00008	ff 15 00 00 00
	00		 call	 DWORD PTR __imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z

; 34   : }

  0000e	33 c0		 xor	 eax, eax
  00010	c3		 ret	 0
_main	ENDP
_TEXT	ENDS
END
</code></pre>
<p>Ohne std::cout hat er es sogar ganz weg gelassen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1566509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1566509</guid><dc:creator><![CDATA[unterschätzt]]></dc:creator><pubDate>Sun, 17 Aug 2008 16:51:25 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Performance on Sun, 17 Aug 2008 16:55:51 GMT]]></title><description><![CDATA[<p>Aber mit variablem n geht es nicht mehr.</p>
<pre><code class="language-cpp">int main(int argc, char** argv) {
	int n = argc;
	int erg = 0, i = 0;
	for(i = 0; i &lt; n; ++i)
	   erg += i; 

	std::cout&lt;&lt;erg;
}
</code></pre>
<pre><code class="language-asm">;	COMDAT _main
_TEXT	SEGMENT
_argc$ = 8						; size = 4
_argv$ = 12						; size = 4
_main	PROC						; COMDAT

; 27   : int main(int argc, char** argv) {

  00000	53		 push	 ebx
  00001	57		 push	 edi

; 28   : 	int n = argc;
; 29   : 	int erg = 0, i = 0;
; 30   : 	for(i = 0; i &lt; n; ++i)

  00002	8b 7c 24 0c	 mov	 edi, DWORD PTR _argc$[esp+4]
  00006	33 d2		 xor	 edx, edx
  00008	33 c9		 xor	 ecx, ecx
  0000a	33 db		 xor	 ebx, ebx
  0000c	33 c0		 xor	 eax, eax
  0000e	83 ff 02	 cmp	 edi, 2
  00011	7c 12		 jl	 SHORT $LC9@main
  00013	56		 push	 esi
  00014	8d 77 ff	 lea	 esi, DWORD PTR [edi-1]
$LL10@main:

; 31   : 	   erg += i; 

  00017	03 d0		 add	 edx, eax
  00019	8d 4c 01 01	 lea	 ecx, DWORD PTR [ecx+eax+1]
  0001d	83 c0 02	 add	 eax, 2
  00020	3b c6		 cmp	 eax, esi
  00022	7c f3		 jl	 SHORT $LL10@main
  00024	5e		 pop	 esi
$LC9@main:

; 28   : 	int n = argc;
; 29   : 	int erg = 0, i = 0;
; 30   : 	for(i = 0; i &lt; n; ++i)

  00025	3b c7		 cmp	 eax, edi
  00027	7d 02		 jge	 SHORT $LN8@main

; 31   : 	   erg += i; 

  00029	8b d8		 mov	 ebx, eax
$LN8@main:
  0002b	03 ca		 add	 ecx, edx

; 32   : 
; 33   : 	std::cout&lt;&lt;erg;

  0002d	03 cb		 add	 ecx, ebx
  0002f	51		 push	 ecx
  00030	8b 0d 00 00 00
	00		 mov	 ecx, DWORD PTR __imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A
  00036	ff 15 00 00 00
	00		 call	 DWORD PTR __imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z
  0003c	5f		 pop	 edi

; 34   : }

  0003d	33 c0		 xor	 eax, eax
  0003f	5b		 pop	 ebx
  00040	c3		 ret	 0
_main	ENDP
_TEXT	ENDS
END
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1566513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1566513</guid><dc:creator><![CDATA[unterschätzt]]></dc:creator><pubDate>Sun, 17 Aug 2008 16:55:51 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Performance on Sun, 17 Aug 2008 17:04:01 GMT]]></title><description><![CDATA[<p>Hm, cool. <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>Aber ich glaube nicht, dass er sieht, dass er die Schleife durch ne einfache Berechnung ersetzen kann. Vielmehr sieht der wohl in der Datenflußanalyse, dass er den Wert direkt berechnen kann und tut das dann -- indem er die Schleife ausführt. Mehr braucht man von einem Compiler ja auch nicht zu erwarten. Aus der Schleife den Ausdruck n*(n+1)/2 zu machen ist imo die Aufgabe des Programmierers.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1566517</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1566517</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Sun, 17 Aug 2008 17:04:01 GMT</pubDate></item></channel></rss>