<?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[Ergebnisse der Geschwindigkeitstest versch. Funktionen mit gleichen Ergebnissen]]></title><description><![CDATA[<p>Hallo, ich habe was im Buch gelesen über Arrays und deren Zeiger</p>
<p>da sind 3 versch. Funktionen die dieselben Ergebnisse liefern - die Aufgabe ist es einfach die Strings zu kopieren. als Beispiele gegeben und der Autor meint<br />
die arbeiten wie strcpy<br />
Er meint also: Zeigerversionen sind der Index vorzuziehen, da sie schneller sind. Hier mal die Beispiele:</p>
<p>1:<br />
Indexversion von strcpy():</p>
<pre><code class="language-cpp">void strcpy1( char s1[], char s2[])
{
	int i;
	for( i = 0; s2[i] != '\0'; ++i)
		s1[i] = s2[i];
	s1[i] = '\0';
}
</code></pre>
<p>2:<br />
Zeigerversion 1 von strcpy():</p>
<pre><code class="language-cpp">void strcpy2( char *s1, char *s2)
{
	for( ; *s2 != '\0'; ++s1, ++s2)
		*s1 = *s2;
	*s1 = '\0';
}
</code></pre>
<p>3:<br />
Zeigerversion 2 von strcyp():</p>
<pre><code class="language-cpp">void strcpy3( char *s1, char *s2)
{
	while( (*s1++ = *s2++) != '\0' );
}
</code></pre>
<p>4:<br />
die gewöhnliche standard-strcpy</p>
<pre><code class="language-cpp">strcpy( ziel, quelle);
</code></pre>
<p>Jetzt habe ich sie mal mit Stoppuhr getestet mit 80000000 Wiederholungen:</p>
<p>Die Ergebnisse:</p>
<blockquote>
<p>1: 2.27148 Sekunden<br />
2: 2.30907 Sekunden<br />
3: 2.58862 Sekunden<br />
4: 2.11555 Sekunden</p>
</blockquote>
<p>Es ist also genau andersrum - die Zeigerversionen sind nicht schneller als die Indexversion. Zeigerversion 3 ist das langsamste - wieso? Und wieso ist die standard-strcpy nochmal um 0.2 Sekunden schneller das erste? Wie schaffen die das?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/183690/ergebnisse-der-geschwindigkeitstest-versch-funktionen-mit-gleichen-ergebnissen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 13:38:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/183690.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 07 Jun 2007 16:08:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ergebnisse der Geschwindigkeitstest versch. Funktionen mit gleichen Ergebnissen on Thu, 07 Jun 2007 16:08:01 GMT]]></title><description><![CDATA[<p>Hallo, ich habe was im Buch gelesen über Arrays und deren Zeiger</p>
<p>da sind 3 versch. Funktionen die dieselben Ergebnisse liefern - die Aufgabe ist es einfach die Strings zu kopieren. als Beispiele gegeben und der Autor meint<br />
die arbeiten wie strcpy<br />
Er meint also: Zeigerversionen sind der Index vorzuziehen, da sie schneller sind. Hier mal die Beispiele:</p>
<p>1:<br />
Indexversion von strcpy():</p>
<pre><code class="language-cpp">void strcpy1( char s1[], char s2[])
{
	int i;
	for( i = 0; s2[i] != '\0'; ++i)
		s1[i] = s2[i];
	s1[i] = '\0';
}
</code></pre>
<p>2:<br />
Zeigerversion 1 von strcpy():</p>
<pre><code class="language-cpp">void strcpy2( char *s1, char *s2)
{
	for( ; *s2 != '\0'; ++s1, ++s2)
		*s1 = *s2;
	*s1 = '\0';
}
</code></pre>
<p>3:<br />
Zeigerversion 2 von strcyp():</p>
<pre><code class="language-cpp">void strcpy3( char *s1, char *s2)
{
	while( (*s1++ = *s2++) != '\0' );
}
</code></pre>
<p>4:<br />
die gewöhnliche standard-strcpy</p>
<pre><code class="language-cpp">strcpy( ziel, quelle);
</code></pre>
<p>Jetzt habe ich sie mal mit Stoppuhr getestet mit 80000000 Wiederholungen:</p>
<p>Die Ergebnisse:</p>
<blockquote>
<p>1: 2.27148 Sekunden<br />
2: 2.30907 Sekunden<br />
3: 2.58862 Sekunden<br />
4: 2.11555 Sekunden</p>
</blockquote>
<p>Es ist also genau andersrum - die Zeigerversionen sind nicht schneller als die Indexversion. Zeigerversion 3 ist das langsamste - wieso? Und wieso ist die standard-strcpy nochmal um 0.2 Sekunden schneller das erste? Wie schaffen die das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300852</guid><dc:creator><![CDATA[x]]></dc:creator><pubDate>Thu, 07 Jun 2007 16:08:01 GMT</pubDate></item><item><title><![CDATA[Reply to Ergebnisse der Geschwindigkeitstest versch. Funktionen mit gleichen Ergebnissen on Thu, 07 Jun 2007 16:17:22 GMT]]></title><description><![CDATA[<p>scheisse! stimmt doch nicht</p>
<p>wenn ich die nummer von case vertausche, sind die geschwindigkeiten ganz anders</p>
<p>dann ist strcpy (standard-strcpy) viel langsamer als strcpy3 (Zeigerversion)</p>
<p>[cpp]int a;<br />
cin &gt;&gt; a;<br />
cout &lt;&lt; &quot;Gedrueckt: &quot; &lt;&lt; a &lt;&lt; endl;<br />
cin.get();</p>
<p>QueryPerformanceCounter(&amp;start_ticks);<br />
QueryPerformanceFrequency(&amp;frequenz);</p>
<p>// ... hier irgendwas machen ...</p>
<p>char ziel[30], quelle[] = &quot;Ein String&quot;;</p>
<p>int repeats = 80000000;<br />
for (int i = 0; i &lt; repeats; i++) {</p>
<p>switch( a ) {<br />
case 1:<br />
strcpy1( ziel, quelle);<br />
break;<br />
case 2:<br />
strcpy2( ziel, quelle);<br />
break;<br />
case <strong>3</strong>:<br />
strcpy3( ziel, quelle);<br />
break;<br />
case <strong>4</strong>:<br />
strcpy( ziel, quelle);<br />
break;<br />
default:<br />
break;<br />
}<br />
}[/cpp]</p>
<p>Nur wenn ich die nummer 3 und 4 vertausche - verstehe ich nicht?<br />
Nummer 4 ist immer das schnellste egal welche funktion ich da nehme?????? Wieso liegt das jetzt an case?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300860</guid><dc:creator><![CDATA[x]]></dc:creator><pubDate>Thu, 07 Jun 2007 16:17:22 GMT</pubDate></item><item><title><![CDATA[Reply to Ergebnisse der Geschwindigkeitstest versch. Funktionen mit gleichen Ergebnissen on Thu, 07 Jun 2007 16:21:29 GMT]]></title><description><![CDATA[<p>laut intel und amd sind die arrayversionen schneller, besonders unrolled. laut arm sind die pointerversionen schneller (ich hab beides auch richtig gebenched sodass ich das bestaetigen kann).</p>
<p>deine tests habe so einiges an unperformanten dingen, z.b. switch im inneren der schleife, du wolltest im switch die schleifendurchlaeufe machen!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300861</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300861</guid><dc:creator><![CDATA[rapso]]></dc:creator><pubDate>Thu, 07 Jun 2007 16:21:29 GMT</pubDate></item><item><title><![CDATA[Reply to Ergebnisse der Geschwindigkeitstest versch. Funktionen mit gleichen Ergebnissen on Thu, 07 Jun 2007 16:21:59 GMT]]></title><description><![CDATA[<p>hahaha ich habe jetzt anders programmiert - jetzt funktioniert es!</p>
<pre><code class="language-cpp">char ziel[30], quelle[] = &quot;Ein String&quot;;

int repeats = 80000000;

	switch( a ) {
		case 1:
			for (int i = 0; i &lt; repeats; i++)
				strcpy1( ziel, quelle);
			break;
		case 2:
			for (int i = 0; i &lt; repeats; i++)
				strcpy2( ziel, quelle);
			break;
		case 3:
			for (int i = 0; i &lt; repeats; i++)
				strcpy( ziel, quelle);
			break;
		case 4:
			for (int i = 0; i &lt; repeats; i++)
				strcpy3( ziel, quelle);
			break;
		default:
			break;
	}
</code></pre>
<p>ergebnisse:</p>
<p>2,8<br />
2,3<br />
2,3<br />
2,3</p>
<p>ok alles klar</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300862</guid><dc:creator><![CDATA[x]]></dc:creator><pubDate>Thu, 07 Jun 2007 16:21:59 GMT</pubDate></item><item><title><![CDATA[Reply to Ergebnisse der Geschwindigkeitstest versch. Funktionen mit gleichen Ergebnissen on Thu, 07 Jun 2007 16:24:16 GMT]]></title><description><![CDATA[<p>rapso schrieb:</p>
<blockquote>
<p>laut intel und amd sind die arrayversionen schneller, besonders unrolled. laut arm sind die pointerversionen schneller (ich hab beides auch richtig gebenched sodass ich das bestaetigen kann).</p>
<p>deine tests habe so einiges an unperformanten dingen, z.b. switch im inneren der schleife, du wolltest im switch die schleifendurchlaeufe machen!!!</p>
</blockquote>
<p>was ist arm?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300863</guid><dc:creator><![CDATA[x]]></dc:creator><pubDate>Thu, 07 Jun 2007 16:24:16 GMT</pubDate></item><item><title><![CDATA[Reply to Ergebnisse der Geschwindigkeitstest versch. Funktionen mit gleichen Ergebnissen on Thu, 07 Jun 2007 16:25:46 GMT]]></title><description><![CDATA[<p>achso sorry wusste nicht dass es so etwas gibt. hatte nicht gegoogelt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300864</guid><dc:creator><![CDATA[x]]></dc:creator><pubDate>Thu, 07 Jun 2007 16:25:46 GMT</pubDate></item><item><title><![CDATA[Reply to Ergebnisse der Geschwindigkeitstest versch. Funktionen mit gleichen Ergebnissen on Thu, 07 Jun 2007 16:34:02 GMT]]></title><description><![CDATA[<p>oh sorry ich hab falsch abgelesen :</p>
<p>1.85<br />
2.2<br />
2.3<br />
2.3</p>
<p>stimmt array ist doch schneller.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300869</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300869</guid><dc:creator><![CDATA[x]]></dc:creator><pubDate>Thu, 07 Jun 2007 16:34:02 GMT</pubDate></item><item><title><![CDATA[Reply to Ergebnisse der Geschwindigkeitstest versch. Funktionen mit gleichen Ergebnissen on Thu, 07 Jun 2007 16:35:28 GMT]]></title><description><![CDATA[<p>dann muss ich mich nicht mit so komplizierten pointers kümmern</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300870</guid><dc:creator><![CDATA[x]]></dc:creator><pubDate>Thu, 07 Jun 2007 16:35:28 GMT</pubDate></item><item><title><![CDATA[Reply to Ergebnisse der Geschwindigkeitstest versch. Funktionen mit gleichen Ergebnissen on Thu, 07 Jun 2007 17:01:02 GMT]]></title><description><![CDATA[<p>irgendwie ist x != x?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300878</guid><dc:creator><![CDATA[x]]></dc:creator><pubDate>Thu, 07 Jun 2007 17:01:02 GMT</pubDate></item><item><title><![CDATA[Reply to Ergebnisse der Geschwindigkeitstest versch. Funktionen mit gleichen Ergebnissen on Thu, 07 Jun 2007 18:18:02 GMT]]></title><description><![CDATA[<p>welcome to the SMS generation</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300909</guid><dc:creator><![CDATA[x]]></dc:creator><pubDate>Thu, 07 Jun 2007 18:18:02 GMT</pubDate></item><item><title><![CDATA[Reply to Ergebnisse der Geschwindigkeitstest versch. Funktionen mit gleichen Ergebnissen on Thu, 07 Jun 2007 18:30:02 GMT]]></title><description><![CDATA[<p>arm =&gt; <a href="http://de.wikipedia.org/wiki/ARM-Architektur" rel="nofollow">http://de.wikipedia.org/wiki/ARM-Architektur</a></p>
<p>du solltest nicht mit einer Stopuhr messen. µBenchmarks richtig hinzubekommen ist nicht leicht!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300912</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Thu, 07 Jun 2007 18:30:02 GMT</pubDate></item><item><title><![CDATA[Reply to Ergebnisse der Geschwindigkeitstest versch. Funktionen mit gleichen Ergebnissen on Thu, 07 Jun 2007 21:23:25 GMT]]></title><description><![CDATA[<p>die anderen x's sind nicht echt, sry sollte noch registrieren</p>
<p>rüdiger schrieb:</p>
<blockquote>
<p>arm =&gt; <a href="http://de.wikipedia.org/wiki/ARM-Architektur" rel="nofollow">http://de.wikipedia.org/wiki/ARM-Architektur</a></p>
<p>du solltest nicht mit einer Stopuhr messen. µBenchmarks richtig hinzubekommen ist nicht leicht!</p>
</blockquote>
<p>wie? also ich benütz immer</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;

LARGE_INTEGER start_ticks, ende_ticks, frequenz;

double tick_diff     = 0;
start_ticks.QuadPart = 0;
ende_ticks.QuadPart  = 0;

QueryPerformanceCounter(&amp;start_ticks);
QueryPerformanceFrequency(&amp;frequenz);

// ... Hier Funktionen testen

QueryPerformanceCounter(&amp;ende_ticks);

// benötigte zeit berechnen
tick_diff = ((double) ende_ticks.QuadPart - (double) start_ticks.QuadPart) / frequenz.QuadPart;
cout &lt;&lt; tick_diff &lt;&lt; endl;
</code></pre>
<p>kommen doch immer milisekundengenaue ergebnisse oder was ist nicht leicht? oder du meinst , es hängt immer so sehr von sprüngen ab z.b. funktionssprünge, if-anweisungen usw dass es nicht immer das richtige ergebnis rauskommt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1301003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1301003</guid><dc:creator><![CDATA[x]]></dc:creator><pubDate>Thu, 07 Jun 2007 21:23:25 GMT</pubDate></item><item><title><![CDATA[Reply to Ergebnisse der Geschwindigkeitstest versch. Funktionen mit gleichen Ergebnissen on Fri, 08 Jun 2007 00:58:13 GMT]]></title><description><![CDATA[<p>Naja, schlag mal den Begriff Multitasking-Betriebssystem nach. So wie Du vorgehst könnte der Rechner zu 90% der Meßzeit mit anderen Threads beschäftigt sein ohne das Du das unterscheiden kannst. Für aussagekräftige Messungen brauchst Du einen Profiler.</p>
<p>Und letzten Endes hängen solche Messungen stark vom Zielrechner ab. Auf meinen System z.B. sind die Pointer-Versionen im Schnitt 10% schneller als die Index-Versionen.</p>
<p>das ganze wirkt stark wie premature optimizing...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1301041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1301041</guid><dc:creator><![CDATA[loks]]></dc:creator><pubDate>Fri, 08 Jun 2007 00:58:13 GMT</pubDate></item><item><title><![CDATA[Reply to Ergebnisse der Geschwindigkeitstest versch. Funktionen mit gleichen Ergebnissen on Fri, 08 Jun 2007 05:35:07 GMT]]></title><description><![CDATA[<p>könnt ihr mir einen Profiler empfehlen? Wo find ich sie oder wie mach ich das?</p>
<p>Wiki hab ich schon durchgelesen aber keine Beispiele</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1301055</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1301055</guid><dc:creator><![CDATA[x]]></dc:creator><pubDate>Fri, 08 Jun 2007 05:35:07 GMT</pubDate></item><item><title><![CDATA[Reply to Ergebnisse der Geschwindigkeitstest versch. Funktionen mit gleichen Ergebnissen on Fri, 08 Jun 2007 07:37:42 GMT]]></title><description><![CDATA[<p>Was schneller ist kommt vor allem auf den Compiler drauf an. Nur weil man im C++ Code irgendwo &quot;a[i]&quot; schreibt heisst das noch lange nicht dass im generierten Code auch noch irgendwo ein Zugriff über einen Index vorkommt, der Compiler kann daraus leicht nen Pointer machen der einfach weitergeschoben wird.</p>
<p>Messem mit QueryPerformanceCounter ist im Übrigen schon OK, man muss halt mehrere Messungen machen, und ein wenig aufpassen dass man im Hintergrund nix laufen hat was grob dazwischenfunken könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1301095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1301095</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 08 Jun 2007 07:37:42 GMT</pubDate></item><item><title><![CDATA[Reply to Ergebnisse der Geschwindigkeitstest versch. Funktionen mit gleichen Ergebnissen on Fri, 08 Jun 2007 08:43:16 GMT]]></title><description><![CDATA[<p>Ok, ja. Aber es ist halt nur eine Schätzung und keine absolute Messung und das sollte man im Hinterkopf halten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1301128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1301128</guid><dc:creator><![CDATA[loks]]></dc:creator><pubDate>Fri, 08 Jun 2007 08:43:16 GMT</pubDate></item><item><title><![CDATA[Reply to Ergebnisse der Geschwindigkeitstest versch. Funktionen mit gleichen Ergebnissen on Fri, 08 Jun 2007 10:25:11 GMT]]></title><description><![CDATA[<p>x schrieb:</p>
<blockquote>
<p>könnt ihr mir einen Profiler empfehlen? Wo find ich sie oder wie mach ich das?</p>
</blockquote>
<p>Bei AMD gibts einen kostenlosen Profiler <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="😉"
    /> Und in der GCC ist glaub ich auch einer dabei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1301203</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1301203</guid><dc:creator><![CDATA[darthdespotism]]></dc:creator><pubDate>Fri, 08 Jun 2007 10:25:11 GMT</pubDate></item><item><title><![CDATA[Reply to Ergebnisse der Geschwindigkeitstest versch. Funktionen mit gleichen Ergebnissen on Sat, 09 Jun 2007 10:47:08 GMT]]></title><description><![CDATA[<p>@loks:<br />
Angenommen ich habe 2 Funktionen die das gleiche tun, also 2 Implementierungen von irgendwas. Nennen wir sie A und B.<br />
Nun mache ich ein paar Messungen/Testläufe im Profiler/...</p>
<p>Angenommen ich bekomme dann über den Profiler raus dass A schneller ist, aber alle Messungen die ich mit QueryPerformanceCounter gemacht habe zeigen dass B schneller ist, dann verlasse ich mich auf QueryPerformanceCounter, nicht auf der Profiler.</p>
<p>----</p>
<p>Einen Profiler verwende ich vielleicht um rauszubekommen wo ich noch was optimieren kann, aber sicher nicht um zu entscheiden welche Version einer Funktion schneller ist. Schliesslich läuft das Programm auf dem Zielsystem ja auch nicht mit dem Profiler, sondern &quot;frei&quot;, also genau so wie man es mit QueryPerformanceCounter messen kann.</p>
<p>Solche Messungen eine &quot;Schätzung&quot; zu nennen halte ich für Unsinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1301906</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1301906</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 09 Jun 2007 10:47:08 GMT</pubDate></item></channel></rss>