<?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[Frage zu memcmp vs. selbstgeschriebenem Vergleich]]></title><description><![CDATA[<p>Hallo,<br />
ich habe ein array aus unsigned ints, welches eine große Zahl repräsentiert.<br />
Dieses will ich jetzt mit einem array der gleichen Länge auf Gleichheit bzw Ungleichheit überprüfen lassen. Mein erster Versuch sah so aus:</p>
<pre><code class="language-cpp">bool operator==(const Klasse&amp; obj) const
{
    return std::memcmp(array, obj.array, sizeof(size_t)*array_length) == 0;
}
</code></pre>
<p>Mein zweiter Ansatz sah so aus:</p>
<pre><code class="language-cpp">bool operator==(const Klasse&amp; obj) const
{
    for(size_t i=0;i!=array_length;++i)
        if(array[i]!=obj.array[i]) return false;
    return true;
</code></pre>
<p>Ich frage mich jetzt, welche Version (theoretisch) performanter ist. Wenn es so wäre, dass memcmp byte für byte in einer Schleife das array durchginge, dann wäre mein Ansatz wahrscheinlich schneller, da bei jedem Schleifendurchlauf ja immer eine Register-Größe verglichen wird. Zudem müsste memcmp ja jedes byte zweimal vergleichen (ob größer oder kleiner) um ein Verhältnis ausgeben zu können. Und das kopieren der Zeiger auf die Arrays bei der Parameterübergabe fällt bei meiner Version auch weg.<br />
Allerdings weis ich nicht, in wie Weit der Compiler die memcmp Version optimieren kann. memcpy zum Beispiel ist ja teilweise für verschiedene Prozessortypen optimiert, sodass ein memcpy immer schneller ist, als eine vergleichbare Schleife.<br />
Mich interessiert eure Meinung, welche Funktion am Ende den schnelleren Maschinencode erzeugen würde. Da ich keine Ahnung von Assembler habe, kann ich das leider nicht so einfach nachprüfen.</p>
<p>Schon mal Danke für <strong>konstruktive</strong> Beiträge!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/261332/frage-zu-memcmp-vs-selbstgeschriebenem-vergleich</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 08:23:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/261332.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 17 Feb 2010 01:03:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu memcmp vs. selbstgeschriebenem Vergleich on Wed, 17 Feb 2010 01:03:29 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe ein array aus unsigned ints, welches eine große Zahl repräsentiert.<br />
Dieses will ich jetzt mit einem array der gleichen Länge auf Gleichheit bzw Ungleichheit überprüfen lassen. Mein erster Versuch sah so aus:</p>
<pre><code class="language-cpp">bool operator==(const Klasse&amp; obj) const
{
    return std::memcmp(array, obj.array, sizeof(size_t)*array_length) == 0;
}
</code></pre>
<p>Mein zweiter Ansatz sah so aus:</p>
<pre><code class="language-cpp">bool operator==(const Klasse&amp; obj) const
{
    for(size_t i=0;i!=array_length;++i)
        if(array[i]!=obj.array[i]) return false;
    return true;
</code></pre>
<p>Ich frage mich jetzt, welche Version (theoretisch) performanter ist. Wenn es so wäre, dass memcmp byte für byte in einer Schleife das array durchginge, dann wäre mein Ansatz wahrscheinlich schneller, da bei jedem Schleifendurchlauf ja immer eine Register-Größe verglichen wird. Zudem müsste memcmp ja jedes byte zweimal vergleichen (ob größer oder kleiner) um ein Verhältnis ausgeben zu können. Und das kopieren der Zeiger auf die Arrays bei der Parameterübergabe fällt bei meiner Version auch weg.<br />
Allerdings weis ich nicht, in wie Weit der Compiler die memcmp Version optimieren kann. memcpy zum Beispiel ist ja teilweise für verschiedene Prozessortypen optimiert, sodass ein memcpy immer schneller ist, als eine vergleichbare Schleife.<br />
Mich interessiert eure Meinung, welche Funktion am Ende den schnelleren Maschinencode erzeugen würde. Da ich keine Ahnung von Assembler habe, kann ich das leider nicht so einfach nachprüfen.</p>
<p>Schon mal Danke für <strong>konstruktive</strong> Beiträge!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1856837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1856837</guid><dc:creator><![CDATA[Perfora]]></dc:creator><pubDate>Wed, 17 Feb 2010 01:03:29 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu memcmp vs. selbstgeschriebenem Vergleich on Wed, 17 Feb 2010 01:49:58 GMT]]></title><description><![CDATA[<p>memcmp muß nicht jedes byte zweimal vergleichen, sondern auch nur einmal wie du. erst wenn tatsächlich ein unterschied festgestellt wurde, muß nurnoch am unterschied genauer geschaut werden. da gibts also keinen grund, warum es langsamer oder schneller sein soll.<br />
außerdem ist memcmp bei deinem compiler bestimmt intrinsic. das heißt, daß der compiler keinen memcmp-funktionsaufruf erzeugt, sondern erstmal mit compilermagie herangeht, und je nach zusatzinformationen spezielle versionen bereithält. so wird aus einem memcmp(a,b,4)==0 vermutlich nur ein integervergleich passieren. memcmp (wenn intrinsic) sollte auch so schlau sein, zu erkennen, daß deine integers-feld auf einer durch 4 teilbaren adresse beginnt und endet und deswegen gar nicht erst einzelbytes anfassen, sondern so wie deine schleife 4-byte-weise durchs array hüpfen.<br />
theoretisch sehe ich keinen vor- oder nachteil einer der versionen.<br />
naja, doch, deine vermutung mit den auf bestimmte prozessoren optimierte memcmps. falls es was schnelleres gibt, mit mmx/sse oder so und der compilerbauer auch noch so eine memcmp-version anbieten mag.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1856839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1856839</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 17 Feb 2010 01:49:58 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu memcmp vs. selbstgeschriebenem Vergleich on Wed, 17 Feb 2010 01:54:58 GMT]]></title><description><![CDATA[<p>Hab ich mir gedacht, dass der Compiler wahscheinlich schlauer ist als ich. Danke für die Antwort!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1856840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1856840</guid><dc:creator><![CDATA[Perfora]]></dc:creator><pubDate>Wed, 17 Feb 2010 01:54:58 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu memcmp vs. selbstgeschriebenem Vergleich on Wed, 17 Feb 2010 03:33:11 GMT]]></title><description><![CDATA[<p>So generell kann man nicht sagen was schneller sein wird.<br />
Bei grossen Arrays hat memcmp auf jeden Fall gute Chancen eine einfache Schleife zu schlagen. Ob das mit genau deinem Compiler, deinem Programm, deiner CPU etc. auch wirklich so ist, kannst du nur wissen, wenn du es ausprobierst.</p>
<p>Bei kleinen Arrays dagegen werden die beiden sich wohl nicht viel nehmen.</p>
<p>EDIT: Wobei... gerade bei kleineren Arrays kann memcpy auch wieder ordentlich langsamer sein, weil die Setup Kosten dann viel mehr ins Gewicht fallen. Oder auch nicht <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="🙂"
    /> Wie rüdiger weiter unten schreibt: miss, dann weisst du es, philosophieren bringt wenig <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/1856842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1856842</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 17 Feb 2010 03:33:11 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu memcmp vs. selbstgeschriebenem Vergleich on Wed, 17 Feb 2010 02:49:28 GMT]]></title><description><![CDATA[<p>Hier ist die goldene Regel fürs optimieren: Miss nach oder lass es sein.</p>
<p>Es bringt gerade bei solchen Minioptimierungen nichts darüber zu philosophieren, da diese von vielen äußeren Einflüssen abhängen. Wenn du sinnvoll optimieren willst, dann musst du nachmessen, was etwas bringt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1856843</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1856843</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Wed, 17 Feb 2010 02:49:28 GMT</pubDate></item></channel></rss>