<?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[Speicher freigeben extrem langsam]]></title><description><![CDATA[<p>Hallo Zusammen,</p>
<p>ich habe folgendes Problem: Ich habe eine Baumstruktur an Klassen aufgebaut, so dass Klasse1 einen std-vector aus pointern auf Klasse2 und die wiederum einen std-vector aus pointern auf Klasse3 und in dieser Klasse dann ein std-vector mit long long int Werten liegt.</p>
<p>c++-code sieht dann wie folgt aus:</p>
<pre><code class="language-cpp">class Klasse1 {
public:
	Klasse1();
	~Klasse1();
	std::vector&lt;Klasse2*&gt; Klasse1_Data;        //Länge dynamisch (z.B.10)
    std::vector&lt;long long int&gt; Klasse1_Sum;    //Länge fix (z.B. 100'000)
};

class Klasse2 {
public:
	Klasse2();
	~Klasse2();
    std::vector&lt;Klasse3*&gt; Klasse2_Data;        //Länge fix (z.B. 100'000)
    std::vector&lt;long long int&gt; Klasse2_Sum;    //Länge fix (z.B. 100'000)
};

class Klasse3 {
public:
	Klasse3();
	~Klasse3();
	std::vector&lt;long long int&gt; Klasse3_Data;   //Länge dynamisch (z.B.10-20)
};
</code></pre>
<p>Dann wird folgendes gemacht:</p>
<ol>
<li>Ich lege zum Beispiel mit new() dynamisch 10 Objekte von Klasse2 an und dort wiederrum mit new() 100'000 Elemente von Klasse2 und dort speichere ich dann im Konstruktor eine fest vorgegebene Anzahl, aber für jede der 100'000 Instanzen zufällige und unterschiedliche Anzahl (z.B. mal 14 oder mal 16 oder mal 18 ...), an long long int Zufallszahlen im Vektor Klasse3_Data. In den Vektoren Klasse2_Sum und Klasse1_Sum wir dann jeweils die Summe des Vektors Klasse3_Data der dynamischen Unterklassen gebildet.</li>
</ol>
<p>Nun mein Problem: Die Berechnugen und das Besorgen von Speicher (mach ich mit reserve(10), dann reserve(100000) und reserve(14 oder 16 oder 18) geht sehr schnell innerhalb weniger Sekunden (ca 10 Sekunden), wenn ich aber mit delete die pointer wieder löschen will dauert es ungefähr 10-Mal so lange (ca 120 Sekunden) wie die gesamten Berechnungen und den Speicher zu allokieren.</p>
<p>Die Delete-Prozeduren werden im Destruktor für alle Objekte durchgeführt, also in Klasse1</p>
<pre><code class="language-cpp">for (size_t i=0;i&lt;Klasse1.size();i++) {
		delete Klasse2_Data[i];
	}
</code></pre>
<p>und in Klasse2:</p>
<pre><code class="language-cpp">for (size_t i=0;i&lt;Klasse2_Data.size();i++) {
		delete Klasse2_Data[i];
	}
</code></pre>
<p>Hoffe, dass das einigermasssen verständlich ist, ansosnten bin ich natürlich gerne bereit mehr Infos zu geben. Wär super, wenn jemand eine Idee hätte, wieso dass so extrem langsam ist mit dem Speicher freigeben bzw wie ich das am Besten umbauen könnte, da ich das leider machen muss mit dem Speicher freigeben.</p>
<p>Besten Dank im voraus</p>
<p>Michael</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/237739/speicher-freigeben-extrem-langsam</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 03:54:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/237739.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 01 Apr 2009 09:24:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Wed, 01 Apr 2009 09:24:57 GMT]]></title><description><![CDATA[<p>Hallo Zusammen,</p>
<p>ich habe folgendes Problem: Ich habe eine Baumstruktur an Klassen aufgebaut, so dass Klasse1 einen std-vector aus pointern auf Klasse2 und die wiederum einen std-vector aus pointern auf Klasse3 und in dieser Klasse dann ein std-vector mit long long int Werten liegt.</p>
<p>c++-code sieht dann wie folgt aus:</p>
<pre><code class="language-cpp">class Klasse1 {
public:
	Klasse1();
	~Klasse1();
	std::vector&lt;Klasse2*&gt; Klasse1_Data;        //Länge dynamisch (z.B.10)
    std::vector&lt;long long int&gt; Klasse1_Sum;    //Länge fix (z.B. 100'000)
};

class Klasse2 {
public:
	Klasse2();
	~Klasse2();
    std::vector&lt;Klasse3*&gt; Klasse2_Data;        //Länge fix (z.B. 100'000)
    std::vector&lt;long long int&gt; Klasse2_Sum;    //Länge fix (z.B. 100'000)
};

class Klasse3 {
public:
	Klasse3();
	~Klasse3();
	std::vector&lt;long long int&gt; Klasse3_Data;   //Länge dynamisch (z.B.10-20)
};
</code></pre>
<p>Dann wird folgendes gemacht:</p>
<ol>
<li>Ich lege zum Beispiel mit new() dynamisch 10 Objekte von Klasse2 an und dort wiederrum mit new() 100'000 Elemente von Klasse2 und dort speichere ich dann im Konstruktor eine fest vorgegebene Anzahl, aber für jede der 100'000 Instanzen zufällige und unterschiedliche Anzahl (z.B. mal 14 oder mal 16 oder mal 18 ...), an long long int Zufallszahlen im Vektor Klasse3_Data. In den Vektoren Klasse2_Sum und Klasse1_Sum wir dann jeweils die Summe des Vektors Klasse3_Data der dynamischen Unterklassen gebildet.</li>
</ol>
<p>Nun mein Problem: Die Berechnugen und das Besorgen von Speicher (mach ich mit reserve(10), dann reserve(100000) und reserve(14 oder 16 oder 18) geht sehr schnell innerhalb weniger Sekunden (ca 10 Sekunden), wenn ich aber mit delete die pointer wieder löschen will dauert es ungefähr 10-Mal so lange (ca 120 Sekunden) wie die gesamten Berechnungen und den Speicher zu allokieren.</p>
<p>Die Delete-Prozeduren werden im Destruktor für alle Objekte durchgeführt, also in Klasse1</p>
<pre><code class="language-cpp">for (size_t i=0;i&lt;Klasse1.size();i++) {
		delete Klasse2_Data[i];
	}
</code></pre>
<p>und in Klasse2:</p>
<pre><code class="language-cpp">for (size_t i=0;i&lt;Klasse2_Data.size();i++) {
		delete Klasse2_Data[i];
	}
</code></pre>
<p>Hoffe, dass das einigermasssen verständlich ist, ansosnten bin ich natürlich gerne bereit mehr Infos zu geben. Wär super, wenn jemand eine Idee hätte, wieso dass so extrem langsam ist mit dem Speicher freigeben bzw wie ich das am Besten umbauen könnte, da ich das leider machen muss mit dem Speicher freigeben.</p>
<p>Besten Dank im voraus</p>
<p>Michael</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1689173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689173</guid><dc:creator><![CDATA[Michi78]]></dc:creator><pubDate>Wed, 01 Apr 2009 09:24:57 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Wed, 01 Apr 2009 11:22:12 GMT]]></title><description><![CDATA[<p>Ich bin mir nicht sicher, was der compiler da optimieren kann, bei deiner variante - aber ich würde ma folgendes probieren:</p>
<pre><code class="language-cpp">for (size_t i=0, e(Klasse1.size());i&lt;e;i++) { 
        delete Klasse1_Data[i];
    }
</code></pre>
<p>oder gleich über iteratoren - allerdings sollte einem guten compiler das egal sein...</p>
<p>btw: auf release-mode gestellt?</p>
<p>edit: falls du msvc nutzt: #define _SECURE_SCL 0?</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1689214</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689214</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 01 Apr 2009 11:22:12 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Wed, 01 Apr 2009 12:51:31 GMT]]></title><description><![CDATA[<p>Salü,</p>
<p>Vielen Dank schonmal für die schnelle Antwort, Code bringt leider aber nix bei der Performance. Ansonsten ist auf Release gestellt und ich benutz die Express Edition von Visual C++ 2008. Hab noch das #define _SECURE_SCL 0 eingebaut, bringt aber leider auch nix.</p>
<p>Hab nun nochmal analysiert, wo die Zeit verbraten wird, und es ist tatsächlich im Destruktor von Klasse2, da dort 100'000 Mal der Destruktor von Klasse 3 aufgerufen wird, der dann jeweils den Vektor löscht. Überfordern 100'000 Instanzen der Klasse 3 die Standard-Template-Library?</p>
<p>Beste Grüsse</p>
<p>Michael</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1689252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689252</guid><dc:creator><![CDATA[Michi78]]></dc:creator><pubDate>Wed, 01 Apr 2009 12:51:31 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Wed, 01 Apr 2009 12:56:59 GMT]]></title><description><![CDATA[<p>bau ma nen (compilierbares) minimal-bsp pls...<br />
sonst wird dir da keiner helfen können...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1689258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689258</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 01 Apr 2009 12:56:59 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Wed, 01 Apr 2009 13:13:51 GMT]]></title><description><![CDATA[<p>Tja, k.A. was du machst, aber 100'000 Objekte sind erstmal kein Problem (warum auch?). Code wuerde helfen, dein Problem zu finden, da es an allem liegen kann. Woher nimmst du die Information, dass die meiste Zeit im Destruktor von Klasse 2 verbraten wird? Vielleicht ist auch der Destruktor von Klasse 3 verantwortlich.</p>
<p>Desweiter drueckst du dich recht undeutlich aus:</p>
<blockquote>
<p>new() dynamisch 10 Objekte von Klasse2 an und dort wiederrum mit new() 100'000 Elemente von Klasse2 ...</p>
</blockquote>
<p>Haeh? Wenn du deinen Code sowieso nur in Worten wiedergibst, dann kannst du auch gleich den Code zeigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1689271</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689271</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 01 Apr 2009 13:13:51 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Wed, 01 Apr 2009 17:43:15 GMT]]></title><description><![CDATA[<p>Was bringt dir <code>std::vector</code> , wenn du den Speicher trotzdem manuell verwaltest?</p>
<p>Massen-Allokationen und -Deallokationen sind schneller als einzelne, also lass dich hier durch die STL unterstützen. Vielleicht ist auch <code>std::deque</code> eine Alternative.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1689461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689461</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 01 Apr 2009 17:43:15 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Thu, 02 Apr 2009 08:48:51 GMT]]></title><description><![CDATA[<p>Hab das mal (beispielhaft) programmiert. Hoffe es läuft bei euch. Bei mir dauert das Anlegen des Speichers nur 2 Sek, insgesamt läuft das Programm aber 44 Sek.</p>
<p>Muss doch bei nem vector von pointern das manuell verwalten, sonst gibt er den Speicher doch nicht frei, oder? Bin bei meinen Berechnungen bei ca 1,5GB Speciherbedarf, den ich wieder frei geben muss um weitere Berechnungen zu machen, sonst würd ich halt nur Speicher holen.</p>
<p>Hatte es zuerst ohne Pointer, das war aber noch langsamer...</p>
<pre><code>// Memory_Test.cpp : Defines the entry point for the console application.
//

#include &quot;stdafx.h&quot;
#include &quot;stdio.h&quot;
#include &quot;Memory_Test.h&quot;
#include &lt;ctime&gt;

int NumberSimulations;
double startTime;

Klasse1::Klasse1() {
	for (int i=0 ; i &lt; 3 ; i++) {
		Klasse1_Data.push_back(new Klasse2());
	}
}											
Klasse1::~Klasse1(){
	for (size_t i=0 ; i &lt; Klasse1_Data.size() ; i++) {
		delete Klasse1_Data[i];
	}
}
Klasse2::Klasse2() {
	int lambda;
	Klasse2_Data.reserve(NumberSimulations);
	for (int i=0; i&lt;NumberSimulations;i++) {							// für jede simulation
		lambda = rand()%20;												// Zufallszahl für die Länge des Vektors in Klasse3
		Klasse3* Klasse2_Temp = new Klasse3(lambda);					// Temporäres Objekt zum Speichern der Daten
		for (int j=0; j&lt;lambda; j++) {
			Klasse2_Temp-&gt;Klasse3_Data.push_back(rand());				// füllen des Vektors mit Zufallszahlen
		}
		Klasse2_Data.push_back(Klasse2_Temp);
	}
}
Klasse2::~Klasse2() {
	for (size_t i=0 ; i &lt; Klasse2_Data.size() ; i++) {
		delete Klasse2_Data[i];
	}
}
Klasse3::Klasse3() {
}
Klasse3::~Klasse3() {
}
Klasse3::Klasse3(int lambda) {
	Klasse3_Data.reserve(lambda);										// Reservieren des Speicherplatzes
}
void generateRandomNumbers() {

	std::cout &lt;&lt; &quot;Start Berechnungen &quot; &lt;&lt; std::endl;
	Klasse1 Klasse1Data;
	double endTime = (clock()/CLOCKS_PER_SEC) - startTime;
	std::cout &lt;&lt; &quot;Ende Berechnungen, Zeit: &quot; &lt;&lt; endTime &lt;&lt; &quot; Sek&quot; &lt;&lt; std::endl;
}
int main() {

	startTime = clock()/CLOCKS_PER_SEC;
	NumberSimulations = 100000;
	generateRandomNumbers();
	double endTime = (clock()/CLOCKS_PER_SEC) - startTime;
	std::cout &lt;&lt; &quot;Ende Programm inkl. Destruktor, Zeit: &quot; &lt;&lt; endTime &lt;&lt; &quot; Sek&quot; &lt;&lt; std::endl;
	std::cin &gt;&gt; NumberSimulations;
	return 0;
}
</code></pre>
<p>die .h Datei</p>
<pre><code>#include &lt;vector&gt;
#include &lt;iostream&gt;

class Klasse3 {
public:	
	Klasse3();										
	~Klasse3();
	Klasse3(int);	
	std::vector&lt;long long int&gt; Klasse3_Data;			// Daten per Simulation
};
class Klasse2 {
public:	
	Klasse2();													
	~Klasse2();
	std::vector&lt;Klasse3*&gt; Klasse2_Data;					// Länge entspricht Anzahl der Simulationen
	std::vector&lt;long long int&gt; Klasse2_Sum;				// Summe der pro Simulation
};
class Klasse1 {
public:	
	Klasse1();											
	~Klasse1();
	std::vector&lt;Klasse2*&gt; Klasse1_Data;					// Länge entspricht Anzahl der gewünschten Objekte
	std::vector&lt;long long int&gt; Klasse1_Sum;				// Summe der pro Simulation
};
</code></pre>
<p>Wär super, wenn also irgendwer weiss, wie ich das Speicher freigeben schneller als 42 Sek. machen kann. Irgendwie kann es doch nicht sein, dass das 20mal länger dauert als den Speicher zu allokieren???</p>
<p>Besten Dank</p>
<p>Michael</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1689654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689654</guid><dc:creator><![CDATA[Michi78]]></dc:creator><pubDate>Thu, 02 Apr 2009 08:48:51 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Thu, 02 Apr 2009 18:29:12 GMT]]></title><description><![CDATA[<p>Naja - unter Minimalbsp verstehe ich aber was anderes - und schön getrennt ist das auch net (seit wann implementiert man fkt einer klasse in der main, schreibt aber die klasse in ne eigene header-datei?)</p>
<p>Mal davon abgesehen, waren einige Dinge ja echt bäh -.- (bsp. implementiert man keinen DTor, um dort dann gar nix zu machen etc.)</p>
<p>ich hab folgende Zeiten: (create/destruct)<br />
(@E8400 @3GHz CPU, 32bit programm, 64bit vista)</p>
<p><code>std::vector&lt;T&gt;</code> 39/30 (wobei ich gedacht hätte, dass er da klüger ist ^^)<br />
<code>std::vector&lt;T*&gt;</code> 0/33<br />
<code>boost::ptr_vector &lt;T&gt;</code> 0/33</p>
<p>überraschenderweise hat er bei dem x64 compilat deutlich länger gebraucht (und ich dachte bis jz immer, dass der e8400 wirklich ne 64bit cpu ist - ist offenbar aber nur 64bit kompatibel):</p>
<p>81/61<br />
0/64<br />
0/64</p>
<p>vll (mit Sicherheit) bringt es etwas, nen memory-pool anzulegen, über placement new zu gehen und dann kannst du das delete auch endlich auf ein großes stück speicher und nicht auf 30000kleine jagen ^^<br />
fragt sich nur, ob bei einer simulation 30 sekunden so groß ins gewicht fallen...</p>
<p>über iteratoren im dtor gings auch nicht schneller - die zeit wird aber wirklich komplett im dtor von klasse2 &quot;verbraucht&quot;...<br />
(aber es muss ja auch 300000x delete aufrufen)</p>
<p>ich hab auch mal einiges geändert:<br />
hab auch noch bissl was unsinniges eingebaut, weil ich angst hatte, dass der compiler womöglich zu viel optimiert...<br />
(vll findet sich jmd anderes, der es jz machen möchte)</p>
<pre><code class="language-cpp">#if 0
#	define _SECURE_SCL 0
#	include &lt;vector&gt;
#	define VEC(X) std::vector&lt;X*&gt;
#	define DTOR_NEEDED
#elif 0
#	include &lt;boost/ptr_container/ptr_vector.hpp&gt;
#	define VEC(X) boost::ptr_vector&lt;X&gt;
#	define STACK_BACK
#elif 1
#	define _SECURE_SCL 0
#	include &lt;vector&gt;
#	define VEC(X) std::vector&lt;X&gt;
#	define STACK
#endif

#include &lt;ctime&gt; 
#include &lt;iostream&gt;

clock_t t1(0);
long long int ctorcount(0);
long long int dtorcount(0);

class Klasse3
{
public:    
    Klasse3(size_t lambda = 0)
	{
		++ctorcount;
	    Klasse3_Data.reserve(lambda);
	}

	std::vector&lt;long long int&gt; Klasse3_Data;
};

class Klasse2
{ 
public:    
    Klasse2(size_t NumberSimulations)
	{
		Klasse2_Data.reserve (NumberSimulations);
		for (size_t i(0), e(NumberSimulations); i != e; ++i)
		{
			const int lambda = rand()%20;

			Klasse2_Data.push_back (
#ifndef STACK
				new
#endif
				Klasse3(lambda)
			);

			for (size_t j(0), ej(lambda); j != ej; ++j)
			{
#if defined (STACK) || defined (STACK_BACK)
				Klasse2_Data.back().Klasse3_Data.push_back ( rand() );
#else
				Klasse2_Data.back()-&gt;Klasse3_Data.push_back ( rand() );
#endif
			}
		}
	}
#ifdef DTOR_NEEDED
    ~Klasse2()
	{
		clock_t a = clock();
		for (size_t i (0), e(Klasse2_Data.size()) ; i != e ; ++i)
		{
			++dtorcount;
			delete Klasse2_Data[i];
		}
		t1 += clock() -a;
	}
#endif
    VEC(Klasse3) Klasse2_Data;
};

class Klasse1
{ 
public:    
    Klasse1(size_t NumberSimulations)
	{
		for (size_t i=0; i != 3 ;++i)
		{
			Klasse1_Data.push_back (
#ifndef STACK
				new
#endif
				Klasse2(NumberSimulations)
			);
		}
	}
#ifdef DTOR_NEEDED
    ~Klasse1()
	{
		for (size_t i(0), e(Klasse1_Data.size()) ; i != e ; ++i)
		{
	        delete Klasse1_Data[i];
		}
	}
#endif

	VEC(Klasse2) Klasse1_Data;
};

std::ostream&amp; operator &lt;&lt; (std::ostream&amp; f, const Klasse1 &amp;these)
{
	return f &lt;&lt; &quot;muell: &quot; &lt;&lt; these.Klasse1_Data.size() &lt;&lt; &quot; / &quot; &lt;&lt; ctorcount;
}

int main()
{
    const double startTime = clock()/CLOCKS_PER_SEC;
    size_t NumberSimulations = 100000;

	std::cout &lt;&lt; &quot;Start Berechnungen&quot; &lt;&lt; std::endl;
	{
		Klasse1 Klasse1Data(NumberSimulations);
	    double endTime = (clock()/CLOCKS_PER_SEC) - startTime;
		std::cout &lt;&lt; &quot;Ende Berechnungen, Zeit: &quot; &lt;&lt; endTime &lt;&lt; &quot; Sek&quot; &lt;&lt; std::endl;
		std::cout &lt;&lt; Klasse1Data &lt;&lt; std::endl;
	}

	double endTime = (clock()/CLOCKS_PER_SEC) - startTime;
    std::cout &lt;&lt; &quot;Ende Programm inkl. Destruktor, Zeit: &quot; &lt;&lt; endTime &lt;&lt; &quot; Sek&quot; &lt;&lt; std::endl;

	std::cout &lt;&lt; &quot;1: &quot; &lt;&lt; t1 &lt;&lt; &quot; (&quot; &lt;&lt; dtorcount &lt;&lt; &quot;x)&quot; &lt;&lt; std::endl;

	system(&quot;pause&quot;);
}
</code></pre>
<p>bb</p>
<p>edit:<br />
<code>#define _SECURE_SCL 0</code> bei <code>std::vector&lt;T&gt;</code> vergessen ^^<br />
-&gt; zeiten geändert ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1690040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1690040</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 02 Apr 2009 18:29:12 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Thu, 02 Apr 2009 18:16:10 GMT]]></title><description><![CDATA[<p>Dein Code ist ein ziemliches Gewirr. Wieso leitest du die Konstruktionen weiter und erzeugst jeweils einzelne Instanzen mit <code>new</code> ? Die Gefahr für Memory Leaks steigt damit stark.</p>
<p>Aber grundsätzlich finde ich den Code sehr unübersichtlich. Die Aufgaben sind völlig willkürlich verteilt. Nur schon der Konstruktor der Klasse3, der Speicher vorreservieren soll, welcher wieder in Klasse2 gefüllt wird. Durch das <code>public</code> ist überhaupt keine Kapselung vorhanden.</p>
<p>Michi78 schrieb:</p>
<blockquote>
<p>Muss doch bei nem vector von pointern das manuell verwalten, sonst gibt er den Speicher doch nicht frei, oder? Bin bei meinen Berechnungen bei ca 1,5GB Speciherbedarf, den ich wieder frei geben muss um weitere Berechnungen zu machen, sonst würd ich halt nur Speicher holen.</p>
<p>Hatte es zuerst ohne Pointer, das war aber noch langsamer...</p>
</blockquote>
<p>Das glaube ich nicht. Wie gesagt ist es meistens schneller, wenn viel Speicher auf einmal allokiert/deallokiert werden kann.</p>
<p>Kannst du dein Problem nicht auf einen übersichtlichen kurzen Code reduzieren, der dem beschriebenen Verhalten immer noch gerecht wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1690042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1690042</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 02 Apr 2009 18:16:10 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Thu, 02 Apr 2009 18:38:52 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Michi78 schrieb:</p>
<blockquote>
<p>Muss doch bei nem vector von pointern das manuell verwalten, sonst gibt er den Speicher doch nicht frei, oder? Bin bei meinen Berechnungen bei ca 1,5GB Speciherbedarf, den ich wieder frei geben muss um weitere Berechnungen zu machen, sonst würd ich halt nur Speicher holen.</p>
<p>Hatte es zuerst ohne Pointer, das war aber noch langsamer...</p>
</blockquote>
<p>Das glaube ich nicht. Wie gesagt ist es meistens schneller, wenn viel Speicher auf einmal allokiert/deallokiert werden kann.</p>
</blockquote>
<p>hum? er hat aber keine einfache möglichkeit, das auf einmal zu allokieren/deallokieren - er müsste eben wie gesagt den weg über den memory pool gehen - das sollte zwar nicht unendlich viel arbeit sein, aber konzeptionell ist es bestimmt nich gerad einfach (am stück? eher nich bei 1,5GB -&gt; blockgröße?)<br />
er muss alle news durch placement news ersetzen oder direkt nen eigenen allokator schreiben und den 3 klassen diesen mitgeben...</p>
<p>würde aber einiges für die lsg sprechen, denk ich ^^</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1690058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1690058</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 02 Apr 2009 18:38:52 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Fri, 03 Apr 2009 09:34:29 GMT]]></title><description><![CDATA[<p>Sorry an alle für den Code-Wirrwar, bin halt schon froh wenn der Rechner das macht, was er machen sollte... Vielen Dank aber für eure Ideen.</p>
<p>unskilled schrieb:</p>
<blockquote>
<p>fragt sich nur, ob bei einer simulation 30 sekunden so groß ins gewicht fallen...</p>
</blockquote>
<p>naja, bei dem Beispiel werden ca 50MB Speicher genutzt. Bei 1,5 GB, den ich ca 2-3 mal freigeben müsste, warte ich dann schon eine ganze Weile auf die Speicher-Putzkolonne...</p>
<p>unskilled schrieb:</p>
<blockquote>
<p>er hat aber keine einfache möglichkeit, das auf einmal zu allokieren/deallokieren - er müsste eben wie gesagt den weg über den memory pool gehen</p>
</blockquote>
<p>Das seh ich ähnlich, denn ich weiss nunmal nicht wieviel ich brauche da die Länge der Vektoren zufällig ist und sich in jeder Simulation ändert. Wie würde denn das mit dem Memory-Pool prinzipiell gehen, könntest mir das kurz erklären???</p>
<p>unskilled schrieb:</p>
<blockquote>
<p>aber es muss ja auch 300000x delete aufrufen</p>
</blockquote>
<p>Was ich halt nicht versteh ist, wieso 300000 mal den Destruktors aufzurufen so extrem viel länger dauert als 300000 mal den Konstruktor.</p>
<p>Hoffe, irgendwer hat noch Ideen oder Anregungen...</p>
<p>Beste Grüsse</p>
<p>Michael</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1690299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1690299</guid><dc:creator><![CDATA[Michi78]]></dc:creator><pubDate>Fri, 03 Apr 2009 09:34:29 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Fri, 03 Apr 2009 09:47:30 GMT]]></title><description><![CDATA[<p>Ich hab den Code gerade mal ausprobiert, dauert bei mir alles exakt 0 Sekunden, mit VS05.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1690305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1690305</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Fri, 03 Apr 2009 09:47:30 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Fri, 03 Apr 2009 10:45:39 GMT]]></title><description><![CDATA[<p>Michi78 schrieb:</p>
<blockquote>
<p>Wie würde denn das mit dem Memory-Pool prinzipiell gehen, könntest mir das kurz erklären???</p>
</blockquote>
<p>Selber machen lohnt sich nicht. Schau mal hier:<br />
<a href="http://www.boost.org/doc/libs/1_38_0/libs/pool/doc/index.html" rel="nofollow">http://www.boost.org/doc/libs/1_38_0/libs/pool/doc/index.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1690342</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1690342</guid><dc:creator><![CDATA[Bulli]]></dc:creator><pubDate>Fri, 03 Apr 2009 10:45:39 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Fri, 03 Apr 2009 15:34:50 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Ich hab den Code gerade mal ausprobiert, dauert bei mir alles exakt 0 Sekunden, mit VS05.</p>
</blockquote>
<p>Oo<br />
welchen? wie/wo/... ?</p>
<p>ich habs doch extra alles ausprobiert (und hab VS08)</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1690508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1690508</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 03 Apr 2009 15:34:50 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Fri, 03 Apr 2009 16:06:32 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Ich hab den Code gerade mal ausprobiert, dauert bei mir alles exakt 0 Sekunden, mit VS05.</p>
</blockquote>
<p>ja, der kumpel kann testprogramme der art</p>
<pre><code class="language-cpp">int* arr=new int[...];
//schreib und lies in arr wie du magst
delete[] arr;
</code></pre>
<p>erkennen und wegoptimieren.<br />
man muß generell bei messprogrammen immer dafür sorgen, daß alle operationen in einer ergebniszahl kumukliert werden und dann zum beispiel mit cout.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1690528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1690528</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 03 Apr 2009 16:06:32 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Fri, 03 Apr 2009 16:19:47 GMT]]></title><description><![CDATA[<p>so hab ichs ja nu au extra geschrieben... ~~</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1690532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1690532</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 03 Apr 2009 16:19:47 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Fri, 03 Apr 2009 17:03:06 GMT]]></title><description><![CDATA[<p>Gerade habe ich etwas Ähnliches versucht (unter MSVC++ 2008 Express). Wenn ich auf &quot;Starten&quot; klicke, dauert die Deallokation sehr lange. Benutze ich &quot;Starten ohne Debuggen&quot;, geht es sehr schnell, Allokation und Deallokation dauern ungefähr gleich lange (beide sehr kurz). Das gilt auch für direktes Starten der .exe-Datei, also sobald keine Debugging-Umgebung mehr vorhanden ist.</p>
<p>Ich habe auch ein wenig mit dem AMD CodeAnalyst rumprobiert, da brauchten Aufrufe von <code>operator new</code> und <code>operator delete</code> mit Abstand am wenigsten Zeit. Allerdings weiss ich nicht, wie viel da geinlinet wird, und mit Assembler kenne ich mich zu wenig aus...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1690543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1690543</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 03 Apr 2009 17:03:06 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Fri, 03 Apr 2009 19:31:44 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>man muß generell bei messprogrammen immer dafür sorgen, daß alle operationen in einer ergebniszahl kumukliert werden und dann zum beispiel mit cout.</p>
</blockquote>
<p>In einer von unskilleds Varianten wird ja die Anzahl der Dtor-Aufrufe mitgezählt und am Schluss ausgegeben, der Assembler-Code sieht auch nicht so aus, als ob alles wegoptimiert werden würde <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="😕"
    /></p>
<p>Andererseits hab ich grad mal geschaut, bei mir verbraucht's im Taskmanager auch nur 36 MB, ist ja schon was anderes als die 1,5 GB von denen der TO sprach.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1690589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1690589</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Fri, 03 Apr 2009 19:31:44 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Sat, 04 Apr 2009 02:52:00 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>man muß generell bei messprogrammen immer dafür sorgen, daß alle operationen in einer ergebniszahl kumukliert werden und dann zum beispiel mit cout.</p>
</blockquote>
<p>In einer von unskilleds Varianten wird ja die Anzahl der Dtor-Aufrufe mitgezählt und am Schluss ausgegeben, der Assembler-Code sieht auch nicht so aus, als ob alles wegoptimiert werden würde <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="😕"
    /></p>
<p>Andererseits hab ich grad mal geschaut, bei mir verbraucht's im Taskmanager auch nur 36 MB, ist ja schon was anderes als die 1,5 GB von denen der TO sprach.</p>
</blockquote>
<p>Ich seh gerade, dass es bei mir auch max. 50MB sind - aber es sah so aus, als ob er zwischendrin immermal was wieder freigibt - er optimiert halt einfach zu sehr -.- Zu lange dauern tuts trotzdem ^^<br />
der to kann sich ja ma melden und sagen, wie es mit nem memory-pool aussieht...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1690671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1690671</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 04 Apr 2009 02:52:00 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Sat, 04 Apr 2009 13:14:40 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>Zu lange dauern tuts trotzdem ^^</p>
</blockquote>
<p>Seid ihr jetzt sicher, dass ihr ohne Debug-Laufzeitumgebung startet (auch im Release-Modus)? Bei mir hat das sehr viel ausgemacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1690856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1690856</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 04 Apr 2009 13:14:40 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Sat, 04 Apr 2009 16:09:47 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>unskilled schrieb:</p>
<blockquote>
<p>Zu lange dauern tuts trotzdem ^^</p>
</blockquote>
<p>Seid ihr jetzt sicher, dass ihr ohne Debug-Laufzeitumgebung startet (auch im Release-Modus)? Bei mir hat das sehr viel ausgemacht.</p>
</blockquote>
<p>tzz <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f623.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--persevering_face"
      title="&gt;.&lt;"
      alt="😣"
    /><br />
natürlich hab ichs im release-mode compiliert und getestet...<br />
schnell (&lt;1sec) gings bei mir erst, nachdem ichs nach dem (release-)durchlauf (zusätzlich) nochmal mit dem profiler optimiert hatte - aber der wird ja mitbekommen haben, dass er sämlichen new/delete-kack weglassen kann - und deshalb kann man die werte wohl auch nicht zum vergleich nehmen...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1690931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1690931</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 04 Apr 2009 16:09:47 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Sun, 05 Apr 2009 00:54:00 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>tzz <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f623.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--persevering_face"
      title="&gt;.&lt;"
      alt="😣"
    /><br />
natürlich hab ichs im release-mode compiliert und getestet...</p>
</blockquote>
<p>Natürlich. Es ging aber nicht um Release- vs. Debug-Mode, sondern ums Starten der Laufzeitumgebung. Und bei MSVC++ ist das in beiden Konfigurationen möglich. Wie gesagt hat das bei mir den Grossteil der Zeit ausgemacht.</p>
<p>Da ich das nur gut meinte und auf eine mögliche Fehlerquelle hinweisen wollte, besteht auch kein Grund, so zu antworten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1691077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1691077</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 05 Apr 2009 00:54:00 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Sun, 05 Apr 2009 04:19:45 GMT]]></title><description><![CDATA[<p>Fragt doch erst mal was das Programm machen soll. Es ist sehr wahrscheinlich, dass es da ne bessere Lösung gibt als diesen wirren Code zu optimieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1691084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1691084</guid><dc:creator><![CDATA[Mädels]]></dc:creator><pubDate>Sun, 05 Apr 2009 04:19:45 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Mon, 06 Apr 2009 09:08:51 GMT]]></title><description><![CDATA[<p>Vielen Dank für eure Hilfe</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Wenn ich auf &quot;Starten&quot; klicke, dauert die Deallokation sehr lange. Benutze ich &quot;Starten ohne Debuggen&quot;, geht es sehr schnell, Allokation und Deallokation dauern ungefähr gleich lange (beide sehr kurz)</p>
</blockquote>
<p>Das hat bei mir auch den Effekt, dass es das gesamte Programm innerhalb von 0 Sek ausführt. Hatte vorher immer mit &quot;Starten&quot; (im Release-Mode) das Programm ausgeführt und war mir dessen nicht bewusst... So ganz klar ist es mir allerdings nicht, wobei ich froh bin, dass es nun wie gewünscht funktioniert und den Speicher entsprechend freigibt.</p>
<p>Badestrand schrieb:</p>
<blockquote>
<p>Andererseits hab ich grad mal geschaut, bei mir verbraucht's im Taskmanager auch nur 36 MB, ist ja schon was anderes als die 1,5 GB von denen der TO sprach.</p>
</blockquote>
<p>Die 1,5 GB sind in dem finalen Programm zu erwarten. Das angegebene Beispielprogramm nutzt grob 50MB, sollte ja nur verdeutlichen dass dann 30 Sek Speicher-Freigebezeit pro 50MB bei 1,5 GB schon ne andere Dimension annehmen würde.</p>
<p>unskilled schrieb:</p>
<blockquote>
<p>der to kann sich ja ma melden und sagen, wie es mit nem memory-pool aussieht...</p>
</blockquote>
<p>memory-pool hat irgendwie auch nichts gebracht bei der performance (mit der Version &quot;Starten&quot;)</p>
<p>Werd jetzt erstmal mit der Version &quot;Starten ohne Debuggen&quot; weiterarbeiten, da läuft das Programm ja entsprechend zügig durch.</p>
<p>Merci nochmals</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1691609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1691609</guid><dc:creator><![CDATA[Michi78]]></dc:creator><pubDate>Mon, 06 Apr 2009 09:08:51 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Mon, 06 Apr 2009 14:35:51 GMT]]></title><description><![CDATA[<p>Michi78 schrieb:</p>
<blockquote>
<p>Das hat bei mir auch den Effekt, dass es das gesamte Programm innerhalb von 0 Sek ausführt. Hatte vorher immer mit &quot;Starten&quot; (im Release-Mode) das Programm ausgeführt und war mir dessen nicht bewusst... So ganz klar ist es mir allerdings nicht, wobei ich froh bin, dass es nun wie gewünscht funktioniert und den Speicher entsprechend freigibt.</p>
</blockquote>
<p>Gut, dass es nun funktioniert. <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 hätte auch nie gedacht, dass die Debug-Umgebung zu so langer Verzögerung führt. Wahrscheinlich liegt es an zusätzlichen Sicherheits-Checks oder Debug-Informationen für Speicheroperationen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1691844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1691844</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 06 Apr 2009 14:35:51 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben extrem langsam on Mon, 06 Apr 2009 14:51:38 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Ich hätte auch nie gedacht, dass die Debug-Umgebung zu so langer Verzögerung führt. Wahrscheinlich liegt es an zusätzlichen Sicherheits-Checks oder Debug-Informationen für Speicheroperationen...</p>
</blockquote>
<p>Es wird eine Liste geführt wann wo wieviel Speicher allokiert wurde und wann wo wie wieviel Speicher freigegeben wurde.</p>
<p>Wenn du pech hast, hast du dann auch noch immer schön pagefaults drinnen beim delete - je nach implementierung halt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1691858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1691858</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 06 Apr 2009 14:51:38 GMT</pubDate></item></channel></rss>