<?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[Brauche Optimierungshilfe  :)]]></title><description><![CDATA[<p>Hallo,</p>
<p>die folgende funktion die mit einer struct zusammenarbeitet frisst mir 70% meiner gesamten Laufzeit. Ich habe das mittels callgrind/kcachegrind unter debian linux geprofiled!<br />
Compiler: gcc3.4.3 (ich weiß - net der neueste)</p>
<p>Funktionsweise:<br />
Ich habe eine Matrix in einem vector gespeichert. Die werte sind von oben nach unten und nicht wie üblich von links nach rechts gespeichert - d.h. sie ist SPALTENWEISE gespeichert - d.h. zuerst die werte der ersten spalte, dann der zweiten usw.<br />
Jetzt möchte ich alle ZEILEN der matrix löschen in denen ALLE einträge Null sind. Dies ist schwieriger weil ich ja Spaltenweise gespeichert habe - daran ist leider nix zu ändern.</p>
<p>Im Grunde genommen ist das Problem so zu betrachten:<br />
wir haben ein Array was mit elementen gefüllt ist und einen integer für die dimension.<br />
die grösse des arrays ist natürlich ganz teilbar durch die dimension.<br />
Bsp:<br />
array: 2 3 0 4 0 0 | 6 7 0 2 0 1 | 3 4 0 0 0 7<br />
dimension = 5 d.h. es gibt also drei spalten in der matrix<br />
und jetzt sollen alle nullzeilen gelöscht werden:<br />
1)<br />
2 3 0 4 0 0 | 6 7 0 2 0 1 | 3 4 0 0 0 7<br />
<strong><strong>|</strong></strong><em><strong><strong><strong><strong>|</strong></strong></strong></strong></em>____|</p>
<ol start="2">
<li></li>
</ol>
<p>2 3 4 0 0 | 6 7 2 0 1 | 3 4 0 0 7<br />
<strong><strong><strong>|</strong></strong></strong><em><strong><strong>|</strong></strong></em>______|</p>
<p>ergebnis:</p>
<p>2 3 4 0 6 7 2 1 3 4 0 7</p>
<p>Mein versuch im moment ist dieser:</p>
<pre><code class="language-cpp">void 
 myClass::Lösche_alle_Nullzeilen(std::vector&lt; double &gt;&amp; matrix, 
                       int&amp; x_dim, 
                       int&amp; y_dim, 
                       const int col, 
                       int&amp; idx) 
 { 
     std::vector&lt; bool &gt;     mask( y_dim ); 

     for ( int y = 0; y &lt; y_dim; ++y ) 
     { 
         mask[ y ] = true; 
         if(y == col) 
         { 
             mask[ y ] = false; 
             continue; 
         } 
         for ( int x = 0; x &lt; x_dim; ++x ) 
         { 
             if ( matrix[ x * y_dim + y ] != 0 ) 
             { 
                 mask[ y ] = false; 
                 break; 
             } 
         } 
     } 

     matrix.erase( std::remove_if( matrix.begin(), 
                   matrix.end(), 
                   IS_MASKED( matrix, mask ) ), 
     matrix.end() ); 

     y_dim = matrix.size() / x_dim;     
 } 

 //das struct sieht so aus: 
 struct IS_MASKED 
 { 
     std::vector&lt; bool &gt; mask_; 
     const std::vector&lt; double &gt;* erase_el_; 

     IS_MASKED(const std::vector&lt; double &gt;&amp; erase_el, 
               const std::vector&lt; bool &gt;&amp; mask) : erase_el_( &amp;erase_el ), 
                                                  mask_( mask ) 
     { 
     } 

     bool operator()(const double&amp; f) const 
     { 
         return mask_[ ( &amp;f - &amp;*erase_el_-&gt;begin() ) % mask_.size() ]; 
     } 
 };
</code></pre>
<p>leider wie gesagt dauert das zu lange. Laut meinem callgraphen fressen die iteratoren die meiste Zeit weg - und das aus dieser obigen funktion. Das bedeutet doch aber dass nur das hier:</p>
<pre><code class="language-cpp">matrix.erase( std::remove_if( matrix.begin(), 
                   matrix.end(), 
                   IS_MASKED( matrix, mask ) ), 
     matrix.end() );
</code></pre>
<p>für das löschen verantworlich sein kann da nirgendwo sonst iteratoren in dieser funktion verwendet werden....</p>
<p>für änderungsvorschläge oder auch ideen wie man es besser realisieren könnte bin ich sehr dankbar!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/163812/brauche-optimierungshilfe</link><generator>RSS for Node</generator><lastBuildDate>Sun, 13 Sep 2026 16:49:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/163812.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 02 Nov 2006 00:37:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Brauche Optimierungshilfe  :) on Thu, 02 Nov 2006 01:08:48 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>die folgende funktion die mit einer struct zusammenarbeitet frisst mir 70% meiner gesamten Laufzeit. Ich habe das mittels callgrind/kcachegrind unter debian linux geprofiled!<br />
Compiler: gcc3.4.3 (ich weiß - net der neueste)</p>
<p>Funktionsweise:<br />
Ich habe eine Matrix in einem vector gespeichert. Die werte sind von oben nach unten und nicht wie üblich von links nach rechts gespeichert - d.h. sie ist SPALTENWEISE gespeichert - d.h. zuerst die werte der ersten spalte, dann der zweiten usw.<br />
Jetzt möchte ich alle ZEILEN der matrix löschen in denen ALLE einträge Null sind. Dies ist schwieriger weil ich ja Spaltenweise gespeichert habe - daran ist leider nix zu ändern.</p>
<p>Im Grunde genommen ist das Problem so zu betrachten:<br />
wir haben ein Array was mit elementen gefüllt ist und einen integer für die dimension.<br />
die grösse des arrays ist natürlich ganz teilbar durch die dimension.<br />
Bsp:<br />
array: 2 3 0 4 0 0 | 6 7 0 2 0 1 | 3 4 0 0 0 7<br />
dimension = 5 d.h. es gibt also drei spalten in der matrix<br />
und jetzt sollen alle nullzeilen gelöscht werden:<br />
1)<br />
2 3 0 4 0 0 | 6 7 0 2 0 1 | 3 4 0 0 0 7<br />
<strong><strong>|</strong></strong><em><strong><strong><strong><strong>|</strong></strong></strong></strong></em>____|</p>
<ol start="2">
<li></li>
</ol>
<p>2 3 4 0 0 | 6 7 2 0 1 | 3 4 0 0 7<br />
<strong><strong><strong>|</strong></strong></strong><em><strong><strong>|</strong></strong></em>______|</p>
<p>ergebnis:</p>
<p>2 3 4 0 6 7 2 1 3 4 0 7</p>
<p>Mein versuch im moment ist dieser:</p>
<pre><code class="language-cpp">void 
 myClass::Lösche_alle_Nullzeilen(std::vector&lt; double &gt;&amp; matrix, 
                       int&amp; x_dim, 
                       int&amp; y_dim, 
                       const int col, 
                       int&amp; idx) 
 { 
     std::vector&lt; bool &gt;     mask( y_dim ); 

     for ( int y = 0; y &lt; y_dim; ++y ) 
     { 
         mask[ y ] = true; 
         if(y == col) 
         { 
             mask[ y ] = false; 
             continue; 
         } 
         for ( int x = 0; x &lt; x_dim; ++x ) 
         { 
             if ( matrix[ x * y_dim + y ] != 0 ) 
             { 
                 mask[ y ] = false; 
                 break; 
             } 
         } 
     } 

     matrix.erase( std::remove_if( matrix.begin(), 
                   matrix.end(), 
                   IS_MASKED( matrix, mask ) ), 
     matrix.end() ); 

     y_dim = matrix.size() / x_dim;     
 } 

 //das struct sieht so aus: 
 struct IS_MASKED 
 { 
     std::vector&lt; bool &gt; mask_; 
     const std::vector&lt; double &gt;* erase_el_; 

     IS_MASKED(const std::vector&lt; double &gt;&amp; erase_el, 
               const std::vector&lt; bool &gt;&amp; mask) : erase_el_( &amp;erase_el ), 
                                                  mask_( mask ) 
     { 
     } 

     bool operator()(const double&amp; f) const 
     { 
         return mask_[ ( &amp;f - &amp;*erase_el_-&gt;begin() ) % mask_.size() ]; 
     } 
 };
</code></pre>
<p>leider wie gesagt dauert das zu lange. Laut meinem callgraphen fressen die iteratoren die meiste Zeit weg - und das aus dieser obigen funktion. Das bedeutet doch aber dass nur das hier:</p>
<pre><code class="language-cpp">matrix.erase( std::remove_if( matrix.begin(), 
                   matrix.end(), 
                   IS_MASKED( matrix, mask ) ), 
     matrix.end() );
</code></pre>
<p>für das löschen verantworlich sein kann da nirgendwo sonst iteratoren in dieser funktion verwendet werden....</p>
<p>für änderungsvorschläge oder auch ideen wie man es besser realisieren könnte bin ich sehr dankbar!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1166647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166647</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Thu, 02 Nov 2006 01:08:48 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche Optimierungshilfe  :) on Thu, 02 Nov 2006 00:41:02 GMT]]></title><description><![CDATA[<p>hier ein &quot;unschöner&quot; code der aber bereits schneller ist ...speedup um ca. 15%</p>
<pre><code class="language-cpp">void 
myClass::Lösche_Null_Zeilen_OPT(std::vector&lt; double &gt;&amp; matrix, 
                              int&amp; x_dim, 
                              int&amp; y_dim, 
                              const int col,
                              int&amp; idx)
{
    std::vector&lt; double&gt; erg;
    std::vector&lt; double&gt; row_tmp;
    bool insert = false;
    int new_y_dim = 0;
    for(int y = 0; y &lt; y_dim; y++)
    {
        for(int x = 0; x &lt; x_dim; x++)
        {
            if(matrix[x*y_dim + y] != 0)
                insert = true;
            row_tmp.push_back(matrix[x*y_dim + y ]);
        }   

        if(insert || y == col)
        {
            erg.insert(erg.end(), 
                       row_tmp.begin(),
                       row_tmp.end());
            new_y_dim++;
        }

        insert = false;
        row_tmp.clear();
    }
    matrix.clear();
//     transpose
    for(int x = 0; x &lt; x_dim; x++)
    {
        for(int y = 0; y &lt; new_y_dim; y++)
        {
            matrix.push_back(erg[y * x_dim + x]);   
        }
    }
    y_dim = matrix.size() / x_dim;  
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1166648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166648</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Thu, 02 Nov 2006 00:41:02 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche Optimierungshilfe  :) on Thu, 02 Nov 2006 08:42:17 GMT]]></title><description><![CDATA[<p>Statt Matrix.clear() einfach matrix.resize(0) rufen dürfte auch etwas bringen. Dazu die 2. Matrix von der Capacity auf die Grösse der Originalmatrix vordimensionieren (resize), so spart man sich den stetigen Resize + Umkopiererei bei vielen push_backs.<br />
Um Cachemisses zu vermeiden, könnte man dazu noch jeweils eine Spalte (je nach Grösse) in einen kleinen lokalen Buffer laden und darauf die Operation ausführen.</p>
<p>MfG Kimmi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1166715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166715</guid><dc:creator><![CDATA[kimmi]]></dc:creator><pubDate>Thu, 02 Nov 2006 08:42:17 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche Optimierungshilfe  :) on Thu, 02 Nov 2006 13:04:20 GMT]]></title><description><![CDATA[<p>Also das ist ein Fall den du noch weit besser optimieren kannst. Hab erst heut Abend Zeit, aber wenn ich nicht vergesse poste ich dir nen schönes Beispiel...</p>
<p>Eine Frage vorweg: gibts ne Grenze für x_dim wo du in z.B. 90% aller Fälle drunter liegen wirst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1166947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166947</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 02 Nov 2006 13:04:20 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche Optimierungshilfe  :) on Thu, 02 Nov 2006 23:08:34 GMT]]></title><description><![CDATA[<p>Hallo,<br />
danke für eure Hilfe...bzw. wan noch kommt <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>das mit dem resize(0) und reserve speicher bringt leider fast nichts...macht sich um ca. 0.05 - 0.1 % bemerkbar...</p>
<p>Mit dem 90% ...leider nicht - x_dim ist natürlich die x-dimension der matrix und bleibt es auch - an der ändert sich nichts im gegensatz zum y_dim....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1167328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1167328</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Thu, 02 Nov 2006 23:08:34 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche Optimierungshilfe  :) on Fri, 03 Nov 2006 00:41:26 GMT]]></title><description><![CDATA[<p>Naja das is mir schon klar. Ich meine bei deinen Matritzen, wenn da viele z.B. kleiner 100 Elemente breit sind, dann könnte man den Fall noch optimieren indem man da auf ne dynamische Speicheranforderung verzichtet...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1167366</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1167366</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 03 Nov 2006 00:41:26 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche Optimierungshilfe  :) on Fri, 03 Nov 2006 00:55:29 GMT]]></title><description><![CDATA[<p>hallo,</p>
<p>Hmm...von breite...<br />
ja ...ich glaube es kommt durchaus vor dass die matrizen extrem groß in y - richtugn (also sehr viele Zeilen hat) aber dafür nur sehr klein (&lt; 100) in x-richtung(also wenige spalten hat) vor.<br />
Das kann sehr gut sein....würde sogar sagenn dass die dimensionen in x bei &lt;50 liegen....<br />
d.h es gibt matrizen die z.B dimension haben: 2000 x 5 (zeilen x spalten)</p>
<p>ABER: das muss nicht immer so sein ...würde jetzt pauschal sagen bei 90 % der fälle wie du es eben gemeint hast....</p>
<p>Das einzige was markant ist, ist dass sie dünnbesetzt sind. D.h. von denen ist höchsten 3% - 5% mit werten ungleich Null gefüllt. Aber<br />
eben deshalb das ganze <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/1167369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1167369</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Fri, 03 Nov 2006 00:55:29 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche Optimierungshilfe  :) on Fri, 03 Nov 2006 04:11:39 GMT]]></title><description><![CDATA[<p>Ich glaub ich hab mich da sowieso vertan weil du ja &quot;zeilen&quot; und &quot;spalten&quot; vertauscht hast. Das was bei mir jetzt &quot;columns&quot; ist muss klein sein, aber das ist bei dir ja y... von daher doof wenn das so gross wird <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> . Aber egal.</p>
<p>----</p>
<p>Soda. Hab mir mal gescheit das Hirn verbogen, und das is dabei rausgekommen:<br />
(Vorweg: ich hab &quot;rows&quot; und &quot;columns&quot; verwendet, und bei mir liegen die &quot;rows&quot; continuierlich in der Matrix, dafür entferne ich halt columns <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="🙂"
    /> . Musst halt search &amp; replace machen wenn dir die Namen nicht gefallen - hätte mir sonst zu sehr das Hirn verdreht.)</p>
<pre><code class="language-cpp">void MarkZeroColumns(double const* matrix, size_t rows, size_t columns, char* flags)
{
	if(!(rows &amp;&amp; columns))
		return;

	assert(matrix &amp;&amp; flags);

	double const* src = matrix;

	// process first row
	size_t c = 0;
	size_t n = columns;
	while(n--)
	{
		flags[c] = (*src == 0);
		++c; ++src;
	}

	// process remaining rows
	n = (rows - 1) * columns;
	c = 0;
	while(n--)
	{
		flags[c] &amp;= (*src == 0);
		++c; ++src;
		if(c == columns)
			c = 0;
	}
}

// returns the new column count
size_t NukeColumns(double* matrix, size_t rows, size_t columns, char const* flags)
{
	if(!(rows &amp;&amp; columns))
		return 0;

	assert(matrix &amp;&amp; flags);

	int* dynamicBuffer = 0; // use guard instead if 'double' is changed to a UDT (operator = could throw)
	int* advance;

	// alloc temp space
	if(columns &lt;= 1000)
		advance = static_cast&lt;int*&gt;(alloca((columns + 1) * sizeof(int)));
	else
	{
		dynamicBuffer = new int[columns + 1];
		advance = dynamicBuffer;
	}

	memset(advance, 0, (columns + 1) * sizeof(int));

	// make column advances
	size_t c = 0;
	size_t keep = 0; // nr. of columns to keep
	while(c &lt; columns)
	{
		advance[keep]++;

		if(!flags[c])
		{
			// keep
			++keep;
		}
		++c;
	}

	if(keep &amp;&amp; (keep != columns))
	{
		// make start ptr and fix advance
		double const* src = matrix + advance[0] - 1;
		advance[keep] += advance[0];
		++advance;

		// process all rows
		double* dest = matrix;
		size_t n = rows * keep;
		c = 0;
		while(n--)
		{
			*dest = *src;
			++dest;
			src += advance[c];
			++c;
			if(c == keep)
				c = 0;
		}
	}

	delete [] dynamicBuffer;

	return keep;
}

// returns the new column count
size_t NukeZeroColumnsAndOne(double* matrix, size_t rows, size_t columns, long andOne)
{
	if(!(rows &amp;&amp; columns))
		return 0;

	assert(matrix);

	char* dynamicBuffer = 0;
	char* flags;

	// alloc temp space
	if(columns &lt;= 1000)
		flags = static_cast&lt;char*&gt;(alloca(columns));
	else
	{
		dynamicBuffer = new char[columns];
		flags = dynamicBuffer;
	}

	size_t remainingColumns;

	try
	{
		MarkZeroColumns(matrix, rows, columns, flags);
		if((andOne &gt;= 0) &amp;&amp; (andOne &lt; columns))
			flags[andOne] = 1;
		remainingColumns = NukeColumns(matrix, rows, columns, flags);
	}
	catch(...)
	{
		// TODO: should use guard instead, but I'm to lazy at the moment...
		delete [] dynamicBuffer;
		throw;
	}

	delete [] dynamicBuffer;
	return remainingColumns;
}

int main(int argc, char** argv)
{
	std::vector&lt;double&gt; m;
	size_t columns = 10;
	size_t rows = 10;

	srand(time(0));

	for(size_t r = 0; r &lt; rows; r++)
	{
		for(size_t c = 0; c &lt; columns; c++)
		{
			if((rand() % 100) &lt; 93)
				m.push_back(0);
			else
				m.push_back((rand() * 10.0) / RAND_MAX);
		}
	}

	for(size_t r = 0; r &lt; rows; r++)
	{
		for(size_t c = 0; c &lt; columns; c++)
		{
			printf(&quot;%.2f&quot;, m[r * columns + c]);
			if((c + 1) &lt; columns)
				printf(&quot; | &quot;);
		}
		printf(&quot;\n&quot;);
	}
	printf(&quot;\n&quot;);
	printf(&quot;\n&quot;);

	columns = NukeZeroColumnsAndOne(&amp;m[0], rows, columns, -1);

	for(size_t r = 0; r &lt; rows; r++)
	{
		for(size_t c = 0; c &lt; columns; c++)
		{
			printf(&quot;%.2f&quot;, m[r * columns + c]);
			if((c + 1) &lt; columns)
				printf(&quot; | &quot;);
		}
		printf(&quot;\n&quot;);
	}

	getch();
}
</code></pre>
<p>Die alloca Aufrufe sind bloss damit net wegen jedem kleinen dreck &quot;new&quot; verwendet werden muss, weil new is laaaangsam. Kannste auch rausnehmen, dann würde ich die beiden temp arrays aber gleich von nem std::vector holen, dann ist das auch gleich automatisch exception-safe. Also so quasi:</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; buffer(columns + 1);
	int* advance = &amp;buffer[0];
	// ...
	// und halt kein delete [] am Schluss, sollte klar sein :)
</code></pre>
<p>Wenn die Matritzen meist eher gross sind kannst du die alloca Optimierung rauswerfen, die greift dann sowieso kaum. Und wieviel stack space du opfern willst musst du selbst entscheiden, ich denke aber max. 1000 Elemente sollte ne vernünftige Grenze sein.</p>
<p>Wenn du's verwenden willst bitte teste es noch auf Herz und Nieren, ich bin grad erst fertig geworden und hab nur schnell so drübergeguckt - sieht gut aus, aber mehr als 5 Testläufe hab ich nicht gemacht.</p>
<p>BTW: den bösen conditional jump (&quot;*src == 0&quot;) bringe ich aus der &quot;mark&quot; schleife nicht raus (will der compiler nicht wegmachen - wenns ints statt doubles wären würde er da &quot;setcc&quot; nehmen statt &quot;jcc&quot;), aber wenn sowieso fast alle werte 0 sind sollte es OK sein, dann müsste die jump prediction gut greifen.</p>
<p>p.S.: du kannst es natürlich auch so umbauen dass du den Funktionen nen scratch-space von aussen mitgibst - das würde ich evtl. machen wenn ich draufkommen würde dass zuviel Zeit in &quot;new&quot; draufgeht. z.B. einfach ne non-const Referenz auf nen std::vector, den kann die Funktion dann resizen wenn er zu klein ist, und sonst einfach verwenden. In der Klasse/dem Programmteil wo du die Funktion dann öfters aufrufst packst du den scratch-vector einfach als Member rein, so dass der nie freigegeben wird, und nur mit &quot;resize&quot; vergrössert wenn er zu klein ist. Bzw. der Einfachheit halber 2, einen für char, einen für int.</p>
<p>p.p.S.: den &quot;*src == 0&quot; Test musst du ggf. durch nen Epsilon Test (&quot;fabs(*src) &lt; epsilon&quot;) ersetzen - weiss nicht ob du wirklich bei nem double auf 0 testen willst <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1167381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1167381</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 03 Nov 2006 04:11:39 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche Optimierungshilfe  :) on Fri, 03 Nov 2006 03:59:44 GMT]]></title><description><![CDATA[<p>Was hälst du davon, dass du den Strassen-Algorithmus verwendest....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1167382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1167382</guid><dc:creator><![CDATA[*Cpp-Anfänger* 0]]></dc:creator><pubDate>Fri, 03 Nov 2006 03:59:44 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche Optimierungshilfe  :) on Fri, 03 Nov 2006 08:44:56 GMT]]></title><description><![CDATA[<blockquote>
<p>Das einzige was markant ist, ist dass sie dünnbesetzt sind. D.h. von denen ist höchsten 3% - 5% mit werten ungleich Null gefüllt. Aber<br />
eben deshalb das ganze <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>
</blockquote>
<p>dann wähl lieber eine entsprechende repräsentation und bläh die matrizen nicht unnötig auf. bei dünn besetzten matrizen macht es sinn, eine form der repräsentation zu wählen, bei der ausschließlich werte ungleich 0 gespeichert werden, der gesamte rest wird einfach als 0 angenommen.</p>
<p>für deine überprüfungen lautet das dann:<br />
markiere alle abstände &gt; 1 für die erste spalte.<br />
lösche alle markierungen N, für die in spalte n ein wert vorhanden ist.<br />
wiederhole bis letzte spalte.<br />
-&gt; markierungen sind 0-zeilen.<br />
verringere y-dim von matrix um anzahl markierungen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1167482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1167482</guid><dc:creator><![CDATA[thordk]]></dc:creator><pubDate>Fri, 03 Nov 2006 08:44:56 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche Optimierungshilfe  :) on Fri, 03 Nov 2006 10:15:43 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>vielen dank für eure regen antworten und vor allem auch an</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@Hustbaer</a> für seine Mühe code zu posten - ich werde ihn natürlich (net gleich) aber hoffentlich heute noch testen <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><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12076">@cpp-anfänger</a>: eh ich finde nur schönhage-strassen für ganzzahlmultiplikation und strassen selbst ist für matrix multiplikationen gedacht....wenn du etwas anderes meinst...könntest du da noch genauer werden (evtl. kurzen Link posten?)</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9660">@thordk</a>: vollkommen richtig. würde ich liebend gern machen - das !*@&amp;% blöde ist nur dass ich später noch so schöne dinge wie ne qr-zerlegung auf der resultierenden matrix mache ...und dafür brauche ich halt auch einträge die null sind in einer zeile wo noch nicht-null elemente drin sind <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /><br />
Aber danke für die Idee....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1167546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1167546</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Fri, 03 Nov 2006 10:15:43 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche Optimierungshilfe  :) on Fri, 03 Nov 2006 21:36:16 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a>: könntest du wenn du zeit hast ein wenig erklären was da passiert bei dir?<br />
würde mir sehr helfen - ein blosses vertauschen von rows und columns passt - es funktioniert auch so...aber ne erklärung brauch ich noch <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>EDIT: MarkColumns habe ich jetzt kapiert....was heißt denn das andOne? Ist doch überflüssig oder nicht?</p>
<p>EDIT2:</p>
<p>diesen teil bräuchte ich noch etwas erklärt:</p>
<pre><code class="language-cpp">// make column advances 
    size_t c = 0; 
    size_t keep = 0; // nr. of columns to keep 
    while(c &lt; columns) 
    { 
        advance[keep]++; 

        if(!flags[c]) 
        { 
             // keep 
            ++keep; 
        } 
        ++c; 
    } 

    if(keep &amp;&amp; (keep != columns)) 
    { 
         // make start ptr and fix advance 
        double const* src = matrix + advance[0] - 1; 
        advance[keep] += advance[0]; 
        ++advance; 

         // process all rows 
        double* dest = matrix; 
        size_t n = rows * keep; 
        c = 0; 
        while(n--) 
        { 
            *dest = *src; 
            ++dest; 
            src += advance[c]; 
            ++c; 
            if(c == keep) 
                c = 0; 
        } 
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1167895</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1167895</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Fri, 03 Nov 2006 21:36:16 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche Optimierungshilfe  :) on Fri, 03 Nov 2006 21:55:16 GMT]]></title><description><![CDATA[<p>Könnte daran liegen dass die linux clib (gcc?) beleidigt ist wenn man mit alloca zuviel Speicher anfordert. Änder das von 1000 mal auf 10 oder so, und guck obs dann immer noch crasht bei grossen Matritzen. Ich werd das heute später noch überprüfen und den ganzen Code nochmal durchgehen. Genaue Erklärung folgt dann auch.</p>
<p>Schonmal soviel: die letzte Schleife kopiert so dass die doubles für die neue Matrix quasi &quot;der Reihe nach&quot; geschrieben werden, also geschrieben wird matrix[0], dann matrix[1], matrix[2], matrix[3] etc. - ganz egal welche columns gelöscht werden. Das ist gut weil cache misses beim schreiben viel teurer sind als beim lesen (die cache-row muss ja wieder zurückgeschrieben werden). Und dazu muss die Schleife wissen wie weit sie der &quot;source&quot; Zeiger nach jedem kopierten Wert weiterrücken muss, und natürlich muss man den &quot;source&quot; Zeiger zu Beginn auch auf den ersten nicht-zu-löschenden Wert setzen. Diese &quot;Weiterspring-Weiten&quot; sind im &quot;advance&quot; Array gespeichert. Natürlich könnte man die Schleife auch über die gesamte Matrix laufen lassen, und dann quasi jedesmal mit &quot;if&quot; checken ob die Column gelöscht wird oder nicht, aber ifs sind teuer und langsam und böse (*g*), und es macht ja auch wenig Sinn über die ganze Matritze drüberzupfeiffen wenn man doch bloss die Werte die man wirklich kopieren will einsammeln muss. Und da der Schreibe-Zeiger immer gleich auf mit oder vor dem Lese-Zeiger ist geht das auch ohne dass man sich seine Source-Werte überschreibt bevor man sie kopiert hat.</p>
<p>Ahja, wenn der Fehler nicht am alloca liegt würde es helfen wenn du den gesamten Callstack hier reinklatscht. Kenn mich bei Linux nich so aus, hab auch keins laufen, und auch die Sourcecodes nicht zur Hand.</p>
<p>Und das &quot;NukeZeroColumnsAndOne&quot; heisst lösche alle &quot;alles null&quot; Zeilen, und eine die per Index spezifiziert wird (&quot;und eine&quot;: &quot;and one&quot;). Deine Funktion macht das ja auch so, dachte mir du wirst das wohl auch brauchen, sonst wäre das Parameter ja ziemlich Sinn-frei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1167989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1167989</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 03 Nov 2006 21:55:16 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche Optimierungshilfe  :) on Fri, 03 Nov 2006 22:17:48 GMT]]></title><description><![CDATA[<p>passt passt...es war ein fehler meinerseits...es funktioniert für beliebig große matrizen!!!</p>
<p>Vielen dank hustbaer....ich schaffe es nicht mehr zu profilen heute aber morgen sag ich auf alle fälle bescheid wie groß der speed up ist <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>jetzt verstehe ich nur noch nicht wie du dir die spungweiten merkst:</p>
<p>Sehr eleganz übrigens diese methodik....da muss ich noch um einiges fitter 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="🙂"
    /><br />
großes dankeschön schon mal an dieser stelle....mein pointer-wissen steigt <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="😉"
    /></p>
<pre><code class="language-cpp">// make column advances 
     size_t c = 0; 
     size_t keep = 0; // nr. of columns to keep 
     while(c &lt; columns) 
     { 
         advance[keep]++; 

         if(!flags[c]) 
         { 
              // keep 
             ++keep; 
         } 
         ++c; 
     }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1167997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1167997</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Fri, 03 Nov 2006 22:17:48 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche Optimierungshilfe  :) on Sat, 04 Nov 2006 00:24:50 GMT]]></title><description><![CDATA[<p>Mati schrieb:</p>
<blockquote>
<p>...aber morgen sag ich auf alle fälle bescheid wie groß der speed up ist <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>(...)</p>
<p>jetzt verstehe ich nur noch nicht wie du dir die spungweiten merkst:</p>
<p>(...)</p>
</blockquote>
<p>Naja, hoffentlich isses überhaupt schneller als deine Version (denke aber schon) <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>Also erstmal die Schleife läuft über alle Spalten der ausgangs Matrix drüber.<br />
Anfangen in &quot;advance&quot; zu zählen tun wir mit &quot;advance[0]&quot; (&quot;keep&quot; ist der Index - ist an der Stelle kein guter Name, aber ich bin faul *pfeiff*). Nun wird &quot;advance[keep]&quot; in jedem Durchlauf um eins inkrementiert, und danach wird &quot;keep&quot; inkrementiert (also zum nächsten Element in advance umgeschaltet) wenn die aktuelle Spalte eine ist die übernommen werden soll. Das führt dazu dass nachdem die Schleife durchgelaufen ist in &quot;advance&quot; bestimmte &quot;Distanzen&quot; gesammelt sind, und &quot;keep&quot; die Anzahl der zu kopierenden Spalten enthält. Sagen wir mal &quot;keep&quot; ist 5. Advance sieht dann so aus:</p>
<p>advance[0] = ???<br />
advance[1] = Distanz von der ersten zu kopierenden Spalte zur zweiten zu kopierenden Spalte<br />
advance[2] = Distanz von der zweiten zu kopierenden Spalte zur dritten zu kopierenden Spalte<br />
advance[3] = ... von der dritten zur vierten ...<br />
advance[4] = ... von der vierten zur fünften ...<br />
advance[5] = ???</p>
<p>Eine Distanz von 1 heisst dabei es ist die nächste Spalte, es wird also nix übersprungen (keine Spalte dazwischen ausgelassen). 1 ist also das Minimum. Soweit sollte es denke ich klar sein.</p>
<p>Was steht nun in &quot;advance[0]&quot; und &quot;advance[5]&quot;. Hm. Also es gibt keine &quot;nullte zu kopierende Spalte&quot; - von daher muss da was anderes drinstehen. Gucken wir uns an was in &quot;advance[0]&quot; drin steht wenn wir gleich die erste Spalte der original Matrix kopieren wollen, bzw. was wenn wir erst die zweite kopieren wollen. Im ersten Fall (gleich die erste Spalte soll kopiert werden) steht in &quot;advance[0]&quot; eben 1 drin (zuerst wird &quot;advance[0]&quot; von 0 auf 1 inkrementiert, dann wird &quot;keep&quot; inkrementiert, womit der Wert von &quot;advance[0]&quot; sich nimmer ändern kann). Im zweiten Fall steht in &quot;advance[0]&quot; eben 2 drin, sollte auch klar sein.</p>
<p>-&gt; In &quot;advance[0]&quot; steht die Spaltennummer der ersten zu kopierenden Spalte, bzw. anders ausgedrückt: die Distanz von der imaginären nullten Spalte der original Matrix zur ersten Spalte die kopiert werden soll. Oder noch anders gesagt: die Distanz von der letzten Spalte in der vorhergehenden Zeile zur ersten Spalte die kopiert werden soll in der neuen Zeile.</p>
<p>Und in &quot;advance[5]&quot;? Was relativ leicht ersichtlich ist: wenn die 5. zu kopierende Spalte auch die letzte in der original Matrix war, steht in &quot;advance[5]&quot; 0. Ich kürze hier etwas ab, und behaupte einfach: in &quot;advance[5]&quot; steht die Distanz von der letzten zu kopierenden Spalte zur letzten Spalte der original Matrix <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="🙂"
    /><br />
(Wenn die letzte zu kopierende Spalte zugleich die überhaupt letzte Spalte ist dann ist diese Distanz eben 0)</p>
<p>So, was haben/können wir bis jetzt. Wir haben die Distanzen zwischen allen zu kopierenden Spalten 1 bis 5, fehlt nur noch die Distanz von 5 auf 1, also der Sprung zur nächsten Zeile. Und den bekommen wir einfach durch &quot;advance[5] + advance[0]&quot;, denn &quot;advance[5]&quot; bringt uns bis zur letzten Spalte der original Matrix, und &quot;advance[0]&quot; bringt uns von dort weiter zur ersten zu kopierenden Spalte.</p>
<p>Daher die Addition:</p>
<pre><code class="language-cpp">advance[keep] += advance[0];
</code></pre>
<p>In &quot;advance[keep]&quot; steht nun also diese Distanz von der letzten zu kopierenden Spalte zur ersten zu kopierenden in der nächsten Zeile.</p>
<p>Jetzt steht in jedem &quot;advance[N]&quot; also (mit N von 1 bis &quot;keep&quot;) die korrekte Distanz zum nächsten zu kopierenden Element. Da ich aber mit einem 0 basierten Index drauffahre rücke ich den Zeiger &quot;advance&quot; noch um ein Element weiter, so dass ich nun mit 0...(keep-1) drauffahren kann.</p>
<p>Jetzt fehlt nur noch die korrekte Startposition, und das ist auch einfach. In &quot;advance[0]&quot; (VOR dem weiterrücken des Zeigers!) steht ja die (1-basierte) Nummer der ersten zu kopierenden Spalte, also muss ich bloss vom Anfang der Matrix &quot;advance[0] - 1&quot; Elemente weitergehen um dort zu landen.</p>
<p>Und dann muss nur noch kopiert 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>
<p>Ich hoffe das war einigermassen verständlich. Wenn nicht sag einfach bescheid, wenns an einem bestimmten Punkt hakt kann ich dir das nochmal genauer erklären, bzw. es versuchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1168035</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1168035</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 04 Nov 2006 00:24:50 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche Optimierungshilfe  :) on Sat, 04 Nov 2006 01:12:39 GMT]]></title><description><![CDATA[<p>So. Hab nu selbst ein wenig Profiling gemacht (MSVC 7.1, single threaded runtime, Release, Full Opt.)...</p>
<p>Ich denke es wird sich auszahlen <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="😉"
    /><br />
Bitte schreib was sobald du Resultate hast... würde mich interessieren wie schnell das bei dir wirklich ist (mit &quot;realen&quot; Daten und so).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1168041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1168041</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 04 Nov 2006 01:12:39 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche Optimierungshilfe  :) on Sat, 04 Nov 2006 21:57:22 GMT]]></title><description><![CDATA[<p>hallo hustbaer...</p>
<p>ich hätte noch ne frage...warum bentzt du char arrays?</p>
<p>ich versuche gerade noch eine zeile einzufügen die aber probleme macht:</p>
<pre><code class="language-cpp">const int col = 8; //z.B
flags[col] = 1;
</code></pre>
<p>kann ich so denn nicht ein char array verändern?</p>
<p>Ich komme einfach nicht zum austesten...aber damit ichs vergleichen kann muss ich eben die obige zeile einsetzen...</p>
<p>auf diese weise gehts:</p>
<pre><code class="language-cpp">char* unit; 
    char* dynamicBuffer = 0; 

     // alloc temp space 
    if(rows &lt;= 1000) 
        unit = static_cast&lt;char*&gt;(alloca(rows)); 
    else 
    { 
        dynamicBuffer = new char[rows]; 
        unit = dynamicBuffer; 
    }
    unit[unit_col] = true;

    c = 0; 
    n = rows; 
    while(n--) 
    { 
        flags[c] &amp;= unit[c]; 
        ++c; ++src; 
    } 

    delete [] dynamicBuffer;
</code></pre>
<p>aber als abkürzung reicht doch ein einzeiler bei dem ich lediglich eine stelle auf true setze....nur<br />
läuft das so nicht korrekt...und am ende gibts nen sefault *grmpf</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1168569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1168569</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Sat, 04 Nov 2006 21:57:22 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche Optimierungshilfe  :) on Sat, 04 Nov 2006 22:33:29 GMT]]></title><description><![CDATA[<p>Mati, Freund, was glaubst du was folgende Stelle macht?</p>
<pre><code class="language-cpp">size_t NukeZeroColumnsAndOne(double* matrix, size_t rows, size_t columns, long andOne) 
{ 
    // ...
        MarkZeroColumns(matrix, rows, columns, flags); 
        if((andOne &gt;= 0) &amp;&amp; (andOne &lt; columns)) 
            flags[andOne] = 1; 
    // ...
}
</code></pre>
<p>Naja, egal. Klar reicht es wenn du einfach eine Stelle in &quot;flags&quot; auf true setzt nachdem MarkZeroColumns gelaufen ist. Du musst natürlich sicher stellen dass der Index &gt;= 0 und &lt; &quot;rows&quot; ist.</p>
<p>Und ein char array verwende ich weil ein char das kleinste ist was man in C++ direkt addressieren kann (brauch ja bloss 1 bit), und weil bei bool die Chance bestehen würde dass der Compiler sich genötigt fühlt langsameren Code zu erzeugen als mit char möglich wäre.</p>
<p>Dass du seg-faults bekommst verstehe ich nicht ganz, bei mir läuft das ohne Probleme, auch mit 4000x4000 Matritzen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1168591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1168591</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 04 Nov 2006 22:33:29 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche Optimierungshilfe  :) on Sat, 04 Nov 2006 23:04:55 GMT]]></title><description><![CDATA[<p>ach scheiße...jetzt versteh ichs auch ...peinlich sorry -<br />
ich mach mich endlcih ans profiling....sorry</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1168593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1168593</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Sat, 04 Nov 2006 23:04:55 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche Optimierungshilfe  :) on Sat, 04 Nov 2006 23:37:18 GMT]]></title><description><![CDATA[<p>Kein Problem <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/1168604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1168604</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 04 Nov 2006 23:37:18 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche Optimierungshilfe  :) on Sun, 05 Nov 2006 00:32:22 GMT]]></title><description><![CDATA[<p>*lach<br />
langsam werd ich verrückt...Ich glaube ich hab nen BUG:</p>
<p>versuch mal als input folgende &quot;matrix&quot;<br />
0 0 0 0 0 5</p>
<p>und als andOne = 4 oder andOne = 3</p>
<p>ich bin dabei schon zu lösen aber habs nocht net ....grrrrrr<br />
EDIT: ich heinz: sollte auch beschreiben worans liegt:<br />
also er nimmt in keep hier nicht mehr die eine zeile auf die behalten werden soll durch das andOne...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1168616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1168616</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Sun, 05 Nov 2006 00:32:22 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche Optimierungshilfe  :) on Sun, 05 Nov 2006 00:37:55 GMT]]></title><description><![CDATA[<p>Hihi.<br />
Ja das liegt daran weil ich das falsch verstanden habe, und die Logik umgedreht *pfeiff*<br />
Er behält also nicht die Zeile deren Nummer du übergibst sondern er löscht die dann immer <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>
<p>Ändere einfach das &quot;flags[andOne] = 1&quot; auf &quot;flags[andOne] = 0&quot;. Den Funktionsnamen und den Namen &quot;andOne&quot; solltest du dann natürlich entsprechend anpassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1168623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1168623</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 05 Nov 2006 00:37:55 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche Optimierungshilfe  :) on Mon, 06 Nov 2006 22:14:29 GMT]]></title><description><![CDATA[<p>jo jetzt hab ichs <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="🙂"
    /><br />
geprofiled auch - respekt.</p>
<p>Die harte pointer-arithmetik und dein algorithmus bringen bei meinen testläufen sehr viel.<br />
Ich habe natürlich die methode zum nullzeilenlöschen innerhalb eines anderen algorithmus.<br />
Ursprünglich nach meiner ersten implementierung frass sie 75 % der gesamtlaufzeit. Habe dann eine optimierung (reimplemenierung der methode) gemacht und den anteil auf 55 - 60% gedrückt. Mit deiner variante bekomme ich jetzt 20 - 25 % ! Das ist enorm!</p>
<p>Vielen dank an dieser stelle! Es funkioniert wunderbar <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/1170104</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1170104</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Mon, 06 Nov 2006 22:14:29 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche Optimierungshilfe  :) on Tue, 07 Nov 2006 01:45:16 GMT]]></title><description><![CDATA[<p>Jo gerne. <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/1170137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1170137</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 07 Nov 2006 01:45:16 GMT</pubDate></item></channel></rss>