<?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[Zeit für Methodenaufruf]]></title><description><![CDATA[<p>Ich hab mal mit dem Programm Zeiten für Methodenaufrufe gemessen.</p>
<pre><code class="language-cpp">class Interface
{
public:
	virtual void f(int i) = 0;
};

class Foo : public Interface
{
public:
	Foo():s(0){}
	virtual void f(int i)
	{
		if ( i == 1 )
			s = clock();
		else if ( i == 400000000 )
			std::cout&lt;&lt; clock() - s&lt;&lt;&quot;\n&quot;;
	}
private:
	clock_t s;
};

int main(int argc, char**)
{
	Foo* foo = new Foo();

	boost::function&lt;void(int)&gt; bf = boost::bind(&amp;Foo::f, foo, _1);
	for(int i = 0; i&lt;400000001*argc; i++)
	{
		bf(i);
	}

	void(Foo::*mf)(int);
	mf = &amp;Foo::f;
	for(int i = 0; i&lt;400000001*argc; i++)
	{
		(foo-&gt;*mf)(i);
	}

	Foo sfoo;
	for(int i = 0; i&lt;400000001*argc; i++)
	{
		sfoo.f(i);
	}

	Interface* ifa = foo;
	for(int i = 0; i&lt;400000001*argc; i++)
	{
		ifa-&gt;f(i);
	}

	for(int i = 0; i&lt;400000001*argc; i++)
	{
		foo-&gt;f(i);
	}

}
</code></pre>
<blockquote>
<p>4067 //boost function<br />
1811 //member pointer<br />
455 //Foo auf Stack<br />
1519 //Aufruf über Interface<br />
1660 //Direkter Aufruf</p>
</blockquote>
<p>Boost ist deutlich am langsamsten, aber dafür ist das Objekt schon dran gebunden.<br />
Aufruf mit Interface oder direkt ist praktisch gleich schnell, aber man muss immer das Objekt haben.<br />
Aufruf mit Memberfunction Pointer ist etwas langsamer und man braucht das Objekt.<br />
Foo auf dem Stack ist am schnellsten. Dürfte wohl das virtual weg optimiert sein. Keine Polymorphie möglich, daher uninteressant.</p>
<p>Gibts noch eine andere und schnellere Möglichkeit, die was ähnliches wie boost function macht?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/274039/zeit-für-methodenaufruf</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 19:05:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274039.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 18 Sep 2010 09:07:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeit für Methodenaufruf on Sat, 18 Sep 2010 09:07:39 GMT]]></title><description><![CDATA[<p>Ich hab mal mit dem Programm Zeiten für Methodenaufrufe gemessen.</p>
<pre><code class="language-cpp">class Interface
{
public:
	virtual void f(int i) = 0;
};

class Foo : public Interface
{
public:
	Foo():s(0){}
	virtual void f(int i)
	{
		if ( i == 1 )
			s = clock();
		else if ( i == 400000000 )
			std::cout&lt;&lt; clock() - s&lt;&lt;&quot;\n&quot;;
	}
private:
	clock_t s;
};

int main(int argc, char**)
{
	Foo* foo = new Foo();

	boost::function&lt;void(int)&gt; bf = boost::bind(&amp;Foo::f, foo, _1);
	for(int i = 0; i&lt;400000001*argc; i++)
	{
		bf(i);
	}

	void(Foo::*mf)(int);
	mf = &amp;Foo::f;
	for(int i = 0; i&lt;400000001*argc; i++)
	{
		(foo-&gt;*mf)(i);
	}

	Foo sfoo;
	for(int i = 0; i&lt;400000001*argc; i++)
	{
		sfoo.f(i);
	}

	Interface* ifa = foo;
	for(int i = 0; i&lt;400000001*argc; i++)
	{
		ifa-&gt;f(i);
	}

	for(int i = 0; i&lt;400000001*argc; i++)
	{
		foo-&gt;f(i);
	}

}
</code></pre>
<blockquote>
<p>4067 //boost function<br />
1811 //member pointer<br />
455 //Foo auf Stack<br />
1519 //Aufruf über Interface<br />
1660 //Direkter Aufruf</p>
</blockquote>
<p>Boost ist deutlich am langsamsten, aber dafür ist das Objekt schon dran gebunden.<br />
Aufruf mit Interface oder direkt ist praktisch gleich schnell, aber man muss immer das Objekt haben.<br />
Aufruf mit Memberfunction Pointer ist etwas langsamer und man braucht das Objekt.<br />
Foo auf dem Stack ist am schnellsten. Dürfte wohl das virtual weg optimiert sein. Keine Polymorphie möglich, daher uninteressant.</p>
<p>Gibts noch eine andere und schnellere Möglichkeit, die was ähnliches wie boost function macht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954065</guid><dc:creator><![CDATA[autocode]]></dc:creator><pubDate>Sat, 18 Sep 2010 09:07:39 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit für Methodenaufruf on Sat, 18 Sep 2010 09:30:43 GMT]]></title><description><![CDATA[<p>Wenn's schnell gehen soll, bieten sich Funtoren+Templates an. Und sonst sind virtuelle Funktionen bzw boost::function gar nicht so übel. Man kann eben nicht alles haben. Vielleicht findest Du ja auch ein etwas anderes Design, wobei virtuelle Funktionen (bzw boost::function) nicht so oft aufgerufen werden müssen, so dass der Overhead nicht mehr ins Gewicht fällt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954071</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 18 Sep 2010 09:30:43 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit für Methodenaufruf on Mon, 20 Sep 2010 01:30:09 GMT]]></title><description><![CDATA[<p>Warum braucht die boost-Variante denn länger?</p>
<p>In der Klasse ist doch auch nur das Objekt und der member pointer enthalten oder<br />
sehe ich das falsch?</p>
<p>Kann evtl. ohne boost etwas wegoptimiert werden? Wenn ja, was?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954557</guid><dc:creator><![CDATA[autocode]]></dc:creator><pubDate>Mon, 20 Sep 2010 01:30:09 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit für Methodenaufruf on Mon, 20 Sep 2010 01:54:29 GMT]]></title><description><![CDATA[<p>Was ist eigentlich ein allgemeiner function member pointer?<br />
Falls es eine virtuelle Funktion ist, nur ein Index in die vtbl, aber falls es eine statische Funktion ist ein Zeiger auf die Einsprungadresse. Und dazu noch ein bool, um anzuzeigen, welche Sorte es ist. Und beim Aufruf muß erst mit if auf den bool gestetet werden, welche Sorte es ist und dann entweder direkt gesprungen werden oder erst die Tabelle gelesen und dann gesprungen werden.<br />
Ich denke, hier ist der Ärger zu suchen. Oder wenigstens ein Einsprungpunkt, um den Ärger bis zum Ende genau auseinandernehmen zu können.<br />
Edit:<br />
Ach, da habe ich ja noch function member pointers auf virtuelle Basisklassen vergessen. Dann brauchts ja noch den offset zu Basisklasse. Am Ende ist sizeof() für einen Methodenzeiger 3*sizeof(funktionszeiger). Komisch. Die armen Compilerbauer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954559</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 20 Sep 2010 01:54:29 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit für Methodenaufruf on Mon, 20 Sep 2010 02:23:00 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Dann brauchts ja noch den offset zu Basisklasse.</p>
</blockquote>
<p>Steht dieser Offset nicht eh schon in der vtable? Immerhin ist er für alle<br />
Objekte einer Klasse gleich...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954561</guid><dc:creator><![CDATA[autocode]]></dc:creator><pubDate>Mon, 20 Sep 2010 02:23:00 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit für Methodenaufruf on Mon, 20 Sep 2010 05:59:37 GMT]]></title><description><![CDATA[<p>Ich glaube nicht, dass diese Messung wirklich wiedergibt wie sich die Aufrufe verteilen. Was ist z.B. mit dem ersten Aufruf? Da muss der Code evtl. Erst in den Cache geladen werden - oder auch nicht. Das macht schon einen Riesenunterschied.</p>
<p>Besser wäre es, den Assemblercode zu vergleichen und die benötigten Zyklen zu zählen. Dann gibt es zumindest ein ungefähres Bild, auch wenn in einer realen Anwendung noch andere Effekte eine Rolle spielen können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954573</guid><dc:creator><![CDATA[Gastgast]]></dc:creator><pubDate>Mon, 20 Sep 2010 05:59:37 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit für Methodenaufruf on Mon, 20 Sep 2010 06:08:55 GMT]]></title><description><![CDATA[<p>autocode schrieb:</p>
<blockquote>
<p>Warum braucht die boost-Variante denn länger?</p>
</blockquote>
<p>Naja, erstmal hast Du bei boost::function zwei &quot;Weiterleitungen&quot;. Du rufst boost::function auf, boost::function ruft eine interne Funktion auf. Die interne Funktion ruft das auf, was Du willst. Dazu kommt jetzt noch, dass Du eine weitere Indirektion dabei hast, weil Deine Funktion <code>f</code> virtuell ist.</p>
<p>Wenn es schnell gehen soll, nimmst Du eben Templates+Funktoren, falls möglich. Das ist dann noch besser bzgl Performance weil der Funktions-Code relativ leicht &quot;ge-inline-t&quot; werden kann.</p>
<p>Dann gibt es noch Dinge wie &quot;<a href="http://www.codeproject.com/KB/cpp/ImpossiblyFastCppDelegate.aspx" rel="nofollow">The Impossibly Fast C++ Delegates</a>&quot;, welche speziell für Elementfunktionen gedacht sind und nicht wie boost::function auch mit anderen Funktoren klarkommt. Der Trick ist dabei Elementfunktionszeiger als Templateparameter zu benutzen.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954577</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 20 Sep 2010 06:08:55 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit für Methodenaufruf on Mon, 20 Sep 2010 06:27:56 GMT]]></title><description><![CDATA[<p>Bist du sicher, dass du bei dem Test auch mit Optimierungen kompiliert hast?<br />
Wenn ich das laufen lasse, kommt nämlich folgendes heraus:</p>
<p>`1593</p>
<p>1195</p>
<p>664</p>
<p>1062</p>
<p>1195`</p>
<p>Womit der Unterschied zwischen der boost-Methode und der herkömmlichen eigentlich fast schon nicht mehr der Rede wert ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954581</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954581</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Mon, 20 Sep 2010 06:27:56 GMT</pubDate></item></channel></rss>