<?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[Großes Array mit 0ern überschreiben - memset zu langsam]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe Arrays die sehr groß werden können (10^6 und größer). Diese möchte ich muss/will ich in einer schleife ständig komplett mit Nullern überschreiben. Laut meinem Profiling geht da sehr sehr viel Zeit verloren - memset braucht da einfach zu lang. Gäbe es eine alternative? Oder muss ich mir ernsthafte gedanken an meinen algorithmen machen?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/241739/großes-array-mit-0ern-überschreiben-memset-zu-langsam</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 08:27:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/241739.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 25 May 2009 12:17:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Großes Array mit 0ern überschreiben - memset zu langsam on Mon, 25 May 2009 12:17:53 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe Arrays die sehr groß werden können (10^6 und größer). Diese möchte ich muss/will ich in einer schleife ständig komplett mit Nullern überschreiben. Laut meinem Profiling geht da sehr sehr viel Zeit verloren - memset braucht da einfach zu lang. Gäbe es eine alternative? Oder muss ich mir ernsthafte gedanken an meinen algorithmen machen?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715384</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715384</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Mon, 25 May 2009 12:17:53 GMT</pubDate></item><item><title><![CDATA[Reply to Großes Array mit 0ern überschreiben - memset zu langsam on Mon, 25 May 2009 12:23:35 GMT]]></title><description><![CDATA[<p>testo schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>ich habe Arrays die sehr groß werden können (10^6 und größer). Diese möchte ich muss/will ich in einer schleife ständig komplett mit Nullern überschreiben. Laut meinem Profiling geht da sehr sehr viel Zeit verloren - memset braucht da einfach zu lang. Gäbe es eine alternative? Oder muss ich mir ernsthafte gedanken an meinen algorithmen machen?</p>
<p>Danke</p>
</blockquote>
<p>Ne Alternative wäre die C++-Variante vom C-Style memste, nämlich std::fill. Allerdings bezweifle ich dass das schneller ist.<br />
Du solltest da wohl eher deine Algorithmen überdenken, insbesondere wieso es nötig sein soll, das Array ständig zu nullen (wenn dus danach scheinbar gleich wieder beschreibst, sonst würde einmal nullen ja reichen).<br />
Wenn du uns ein wenig Kontext verrätst kann dir vielleicht geholfen werden <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/1715386</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715386</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 25 May 2009 12:23:35 GMT</pubDate></item><item><title><![CDATA[Reply to Großes Array mit 0ern überschreiben - memset zu langsam on Mon, 25 May 2009 12:23:37 GMT]]></title><description><![CDATA[<p>ich hab vergessen dazuzusagen dass es keine c++ -arrays sind. Von daher ist mein post wohl im c++ forum fehl am platz. Ich benutze im moment reine int* arr. Also keine vectoren oder ähnliches...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715387</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715387</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Mon, 25 May 2009 12:23:37 GMT</pubDate></item><item><title><![CDATA[Reply to Großes Array mit 0ern überschreiben - memset zu langsam on Mon, 25 May 2009 12:25:56 GMT]]></title><description><![CDATA[<p>testo schrieb:</p>
<blockquote>
<p>ich hab vergessen dazuzusagen dass es keine c++ -arrays sind. Von daher ist mein post wohl im c++ forum fehl am platz. Ich benutze im moment reine int* arr. Also keine vectoren oder ähnliches...</p>
</blockquote>
<p>Auch unter C++ gibts Arrays, ganz ohne vector &amp; Co.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715390</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715390</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 25 May 2009 12:25:56 GMT</pubDate></item><item><title><![CDATA[Reply to Großes Array mit 0ern überschreiben - memset zu langsam on Mon, 25 May 2009 12:40:09 GMT]]></title><description><![CDATA[<p>Wenn du mehr Informationen rausruecken wuerdest, dann kann dir vielleicht geholfen werden ...</p>
<p>Wozu dienen denn Arrays der Groesse 10^6? Und wie wird mit ihnen gearbeitet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715403</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715403</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 25 May 2009 12:40:09 GMT</pubDate></item><item><title><![CDATA[Reply to Großes Array mit 0ern überschreiben - memset zu langsam on Mon, 25 May 2009 13:22:45 GMT]]></title><description><![CDATA[<p>ok - ich versuche darzustellen was der subcode macht.</p>
<p>ich habe eine unterschiedliche anzahl an arrays die jeweils eine unterschiedliche anzahl an indizes tragen. Die Länge jedes einzelnen arrays habe ich separat in einem anderen array gespeichert. Ich möchte jetzt für diese gegebenen arrays eine Indexmenge erstellen (ein array) welches mir sozusagen die vereinigung aller indizes der arrays darstellt.</p>
<p>Bsp:<br />
arr1 = 0,1 -&gt;len=2<br />
arr2 = 2,4 -&gt;len=2<br />
arr3 = 1,2,4-&gt;len=3</p>
<p>ergebnis wäre: arr_erg = 0,1,2,4</p>
<p>Jedes der arr* kann maximal eine größe von m haben. Somit kann auch arr_erg maximal m groß werden.</p>
<p>Ich mache es grob so dass ich am Anfang ein boolsches array (arr_map) bereitstelle welches die dimension m hat. Ich laufe jedes arr* ab und dann auch jeden Index und falls in arr_map noch nicht gesetzt ist dann wird hier ein true-value gesetzt und der Index in arr_erg geschrieben. Falls da schon ein true-wert drin steht wird einfach zum nächsten Index gesprungen.</p>
<p>Damit entsteht aber das Problem dass ich im Falle das m groß ist (10^6 z.B.) ich zuerst ein riesieges arr_map baue obwohl es sein kann das die arr* nur sehr klein sind.</p>
<p>Ein Ansatz wäre irgendwie ein pre-processing schritt zu machen und festzustellen wie groß mein arr_map maximal sein wird. Und erst dann die Index-Arrays zu vereinigen. Evtl. gäbe es auch eine Alternative mit einem dictionary oder ähnlichem - C++ - Mittel sind ja erlaubt - ist ein C++-code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715439</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715439</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Mon, 25 May 2009 13:22:45 GMT</pubDate></item><item><title><![CDATA[Reply to Großes Array mit 0ern überschreiben - memset zu langsam on Mon, 25 May 2009 13:28:36 GMT]]></title><description><![CDATA[<p>Was genau hält dich davon ab ein std::set zu verwenden?</p>
<p>Das überprüft eigenständig ob ein Wert bereits vorhanden ist und wenn du das ganze unbedingt als im Speicher zusammenhängendes Array brauchst schreibst dus am schluss mit std::copy in einen std::vector.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715443</guid><dc:creator><![CDATA[rean]]></dc:creator><pubDate>Mon, 25 May 2009 13:28:36 GMT</pubDate></item><item><title><![CDATA[Reply to Großes Array mit 0ern überschreiben - memset zu langsam on Mon, 25 May 2009 13:38:08 GMT]]></title><description><![CDATA[<p>Die Datenstruktur &quot;Array&quot; ist fuer dein Problem ungeeignet. <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/1715452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715452</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 25 May 2009 13:38:08 GMT</pubDate></item><item><title><![CDATA[Reply to Großes Array mit 0ern überschreiben - memset zu langsam on Mon, 25 May 2009 14:38:53 GMT]]></title><description><![CDATA[<p>hmm ja - kann sein. Angenommen wir würden in C programmieren müssen (ich weiß dass wir im c++ forum sind). Was wäre dann hier eine performante alternative?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715502</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Mon, 25 May 2009 14:38:53 GMT</pubDate></item><item><title><![CDATA[Reply to Großes Array mit 0ern überschreiben - memset zu langsam on Mon, 25 May 2009 14:41:10 GMT]]></title><description><![CDATA[<p>Man wuerde sich std::set in C nachbauen. Alternativ kannst du auch eine fertige Implementation eines RB-Tree's nehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715504</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 25 May 2009 14:41:10 GMT</pubDate></item><item><title><![CDATA[Reply to Großes Array mit 0ern überschreiben - memset zu langsam on Mon, 25 May 2009 15:31:47 GMT]]></title><description><![CDATA[<p>ein binärbaum wäre üblich und sehr schnell. eine hashtable wäre vermutlich noch schneller. wenn ich das machen sollte, würde ich es zum anlaß nehmen, mal eine cuckoo-hashtable zu basteln.</p>
<p>außerdem besteht ernsthaft die frage, warum du das array überhaupt dauern nullen mußt.<br />
du benutzt es doch als bit-array. machst du einfach nur zu programmstart einmal nullsetzten. außerdem setzt du die globale zeit auf 0.</p>
<p>ein indexmengenvereinigungszähldurchlauf ist ja dann ungefähr so:</p>
<pre><code class="language-cpp">++globaleZeit;
int result=0;
for each a in zuBetrachtendeIndexmengen
{
  for each i in a
  {
    if feld[i]!=globaleZeit
    {
      feld[i]=globaleZeit;
      ++result;
    }
  }
}
return result;
</code></pre>
<p>und du brauchst im lauf keine nullsetzungen mehr. ok, beim überlauf. also den noch schnell wegmachen.</p>
<pre><code class="language-cpp">static globaleZeit=0;
static short* feld=malloc...
if(globaleZeit==0)
  for(hierDochMalFeldNullsetzen
++globaleZeit;
...
rest wie gehabt;
</code></pre>
<p>mit short brauchst du dann nur alle 65535 durchläufe einmal das feld zu nullen. dürfte selten genug sein. ich vermute, das macht jede baum- oder hasttable-geschichte platt und ist dazu noch total einfach programmiert. <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="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715541</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 25 May 2009 15:31:47 GMT</pubDate></item><item><title><![CDATA[Reply to Großes Array mit 0ern überschreiben - memset zu langsam on Mon, 25 May 2009 16:32:57 GMT]]></title><description><![CDATA[<blockquote>
<p>indexmengenvereinigungszähldurchlauf</p>
</blockquote>
<p><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/1715588</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715588</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 25 May 2009 16:32:57 GMT</pubDate></item></channel></rss>