<?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[Performance von memcpy]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>bisher dachte ich immer ganz naiv, memcpy würde mit ASM der CPU irgendwas magisches sagen, und die wär dann superschnell.<br />
Da mich eben beim Optimieren mein Profiler jedoch drauf hingewiesen hat, habe ich mal getestet:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
// CAUTION! Works only if ( (bytes%4) == 0 ).
void* MyMemcpy( void* dest, void* src, size_t bytes )
{
	int* srcStart = (int*)src - 1;
	int* destStart = (int*)dest - 1;
	int* srcEnd = (int*)src + (bytes &gt;&gt; 2);
	for (; srcStart &lt; srcEnd; )
		*(++destStart) = *(++srcStart);
	return dest;
}
int main()
{
	const size_t memSize( 10000000 );
	unsigned char* mem1( new unsigned char[memSize] );
	unsigned char* mem2( new unsigned char[memSize] );
	std::cout &lt;&lt; &quot;memcpy start\n&quot;;
	for ( int i( 0 ); i &lt; 1000; ++i )
		memcpy( mem2, mem1, memSize );
	std::cout &lt;&lt; &quot;memcpy end\nMyMemcpy start\n&quot;;
	for ( int i( 0 ); i &lt; 1000; ++i )
		MyMemcpy( mem2, mem1, memSize );
	std::cout &lt;&lt; &quot;MyMemcpy end\n&quot;;
	delete[] mem1;
	delete[] mem2;
}
</code></pre>
<p>Auf meinem Rechner (Core i5) ist MyMemcpy nur ca. 20% langsamer als memcpy. Ist mein Compiler (VC++ 2005, Release, speed, SS2 usw.) doof, kann meine Hardware irgendetwas nicht, oder ist bei euch memcpy auch nicht so viel dramatisch schneller?</p>
<p>Gruß<br />
Dobi</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/294623/performance-von-memcpy</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 19:44:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/294623.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 28 Oct 2011 13:17:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Performance von memcpy on Fri, 28 Oct 2011 13:40:05 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>bisher dachte ich immer ganz naiv, memcpy würde mit ASM der CPU irgendwas magisches sagen, und die wär dann superschnell.<br />
Da mich eben beim Optimieren mein Profiler jedoch drauf hingewiesen hat, habe ich mal getestet:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
// CAUTION! Works only if ( (bytes%4) == 0 ).
void* MyMemcpy( void* dest, void* src, size_t bytes )
{
	int* srcStart = (int*)src - 1;
	int* destStart = (int*)dest - 1;
	int* srcEnd = (int*)src + (bytes &gt;&gt; 2);
	for (; srcStart &lt; srcEnd; )
		*(++destStart) = *(++srcStart);
	return dest;
}
int main()
{
	const size_t memSize( 10000000 );
	unsigned char* mem1( new unsigned char[memSize] );
	unsigned char* mem2( new unsigned char[memSize] );
	std::cout &lt;&lt; &quot;memcpy start\n&quot;;
	for ( int i( 0 ); i &lt; 1000; ++i )
		memcpy( mem2, mem1, memSize );
	std::cout &lt;&lt; &quot;memcpy end\nMyMemcpy start\n&quot;;
	for ( int i( 0 ); i &lt; 1000; ++i )
		MyMemcpy( mem2, mem1, memSize );
	std::cout &lt;&lt; &quot;MyMemcpy end\n&quot;;
	delete[] mem1;
	delete[] mem2;
}
</code></pre>
<p>Auf meinem Rechner (Core i5) ist MyMemcpy nur ca. 20% langsamer als memcpy. Ist mein Compiler (VC++ 2005, Release, speed, SS2 usw.) doof, kann meine Hardware irgendetwas nicht, oder ist bei euch memcpy auch nicht so viel dramatisch schneller?</p>
<p>Gruß<br />
Dobi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137130</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Fri, 28 Oct 2011 13:40:05 GMT</pubDate></item><item><title><![CDATA[Reply to Performance von memcpy on Fri, 28 Oct 2011 13:25:08 GMT]]></title><description><![CDATA[<blockquote>
<p>ist MyMemcpy nur ca. 20% langsamer</p>
</blockquote>
<p>20% ist viel. Was hast du erwartet? Btw. Deine Implementation funktionier nur fuer Vielfache von 4.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137133</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 28 Oct 2011 13:25:08 GMT</pubDate></item><item><title><![CDATA[Reply to Performance von memcpy on Fri, 28 Oct 2011 13:41:23 GMT]]></title><description><![CDATA[<p>Stimmt natürlich, danke für den Hinweis. Habs direkt reineditiert, damit nicht irgendwann mal irgendwer drüber stolpert.<br />
Ich hatte halt gedacht, dass man modernen Prozessoren die drei Adressen in bestimmte Register legt, dann den magic_turbo_memcpy-Befehl absetzt und die Post abgeht. Post im Sinne von &quot;um ein Vielfaches schneller&quot;. Scheint ja aber nicht so zu sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137138</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Fri, 28 Oct 2011 13:41:23 GMT</pubDate></item><item><title><![CDATA[Reply to Performance von memcpy on Fri, 28 Oct 2011 13:42:06 GMT]]></title><description><![CDATA[<p>Hat mich auch gewundert, als ich das vor etwas längerer Zeit mal getestet habe. Sollte so ein 128bit-optimiertes memcopy nicht auch ~4 mal schneller sein, als ein 32 bit memcpy?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137139</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Fri, 28 Oct 2011 13:42:06 GMT</pubDate></item><item><title><![CDATA[Reply to Performance von memcpy on Fri, 28 Oct 2011 13:57:21 GMT]]></title><description><![CDATA[<blockquote>
<p>Sollte so ein 128bit-optimiertes memcopy nicht auch ~4 mal schneller sein, als ein 32 bit memcpy?</p>
</blockquote>
<p>Der Speicher wird nicht schneller dadurch. Insbesondere jeder Cache Miss der dann zu einem Zugriff auf den Hauptspeicher führt bremst die CPU massiv aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137150</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 28 Oct 2011 13:57:21 GMT</pubDate></item><item><title><![CDATA[Reply to Performance von memcpy on Sat, 29 Oct 2011 07:52:56 GMT]]></title><description><![CDATA[<p>Ihr meint sicher das Code-Snippet von AMD.</p>
<pre><code class="language-cpp">void nontemporal_copy(char* outbuff, char* inbuff, int size)
	{
		const int step = 64; // cache line
		while(size &gt; step)
		{
			_mm_prefetch(inbuff + 320, _MM_HINT_NTA); // non-temporal prefetch
			__m128i A = _mm_loadu_si128((__m128i*) (inbuff +  0));
			__m128i B = _mm_loadu_si128((__m128i*) (inbuff + 16));
			__m128i C = _mm_loadu_si128((__m128i*) (inbuff + 32));
			__m128i D = _mm_loadu_si128((__m128i*) (inbuff + 48));

			// destination address must be 16-byte aligned!
			_mm_stream_si128((__m128i*) (outbuff +  0), A);
			_mm_stream_si128((__m128i*) (outbuff + 16), B);
			_mm_stream_si128((__m128i*) (outbuff + 32), C);
			_mm_stream_si128((__m128i*) (outbuff + 48), D);

			inbuff  += step;
			outbuff += step;
			size -= step;
		}
		_mm_mfence();
	}
</code></pre>
<p>Non-Temporal bedeutet, dass die geschriebenen Daten nicht in den CPU-Cache geladen werden. Das beugt Cache-Trashing vor.<br />
Aber nur weil es 128bit breite Daten verwendet, ist es noch nicht 4mal so schnell wie memcpy.</p>
<p>Hab gegenüber standard-memcpy aber einen deutlichen Performance-Vorteil gemessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137365</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137365</guid><dc:creator><![CDATA[nurf]]></dc:creator><pubDate>Sat, 29 Oct 2011 07:52:56 GMT</pubDate></item></channel></rss>