<?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[Geschwindigkeit bei geschachtelten try]]></title><description><![CDATA[<p>Hallo,</p>
<p>in einem Programm verwende ich exceptions in teilweise tiefgeschachtelten try/catch -Konstruktionen, aber ich habe ein Geschwindigkeitsproblem und überlege, ob ich dies lösen kann, indem ich mir was anderes einfallen lasse, als try/catch.</p>
<p>Die Frage ist nun, ob viele ineinander geschachtelte try/catch langsamer sind als nur ein try/catch.</p>
<pre><code class="language-cpp">// Variante A

try 
{
   // Tu was
}
catch(...)
{
   // Ein richtiger runtime error
}
</code></pre>
<pre><code class="language-cpp">// Variante B

try
{
   // Tu was
   try
   {
      //Tu was anderes
      throw eA() ;
   }
   catch( eA&amp; x )
   {
       // Korrigiere etwas
   }
}
catch(...)
{
   // Ein richtiger runtime error
}
</code></pre>
<p>Ist also Variante B langsamer, weil es dort zwei try/catch abzuarbeiten gibt?<br />
( Zeitaufwand für &quot;// Korrigiere etwas&quot; braucht nicht berücksichtigt zu werden, da ich den sowieso irgendwie implementieren muss.)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/227292/geschwindigkeit-bei-geschachtelten-try</link><generator>RSS for Node</generator><lastBuildDate>Wed, 30 Sep 2026 04:03:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/227292.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 13 Nov 2008 13:06:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Geschwindigkeit bei geschachtelten try on Thu, 13 Nov 2008 13:06:04 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>in einem Programm verwende ich exceptions in teilweise tiefgeschachtelten try/catch -Konstruktionen, aber ich habe ein Geschwindigkeitsproblem und überlege, ob ich dies lösen kann, indem ich mir was anderes einfallen lasse, als try/catch.</p>
<p>Die Frage ist nun, ob viele ineinander geschachtelte try/catch langsamer sind als nur ein try/catch.</p>
<pre><code class="language-cpp">// Variante A

try 
{
   // Tu was
}
catch(...)
{
   // Ein richtiger runtime error
}
</code></pre>
<pre><code class="language-cpp">// Variante B

try
{
   // Tu was
   try
   {
      //Tu was anderes
      throw eA() ;
   }
   catch( eA&amp; x )
   {
       // Korrigiere etwas
   }
}
catch(...)
{
   // Ein richtiger runtime error
}
</code></pre>
<p>Ist also Variante B langsamer, weil es dort zwei try/catch abzuarbeiten gibt?<br />
( Zeitaufwand für &quot;// Korrigiere etwas&quot; braucht nicht berücksichtigt zu werden, da ich den sowieso irgendwie implementieren muss.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1614094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1614094</guid><dc:creator><![CDATA[kannmichnichterinnern]]></dc:creator><pubDate>Thu, 13 Nov 2008 13:06:04 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit bei geschachtelten try on Thu, 13 Nov 2008 13:20:15 GMT]]></title><description><![CDATA[<p>Ich habe mal gelesen (ich glaube es war im Buch von <a href="http://www.research.att.com/~bs/3rd.html" rel="nofollow">Stroustrup</a>), dass Exception-Handling zumindest theoretisch ohne grosse Performanceeinbussen (soll heissen weniger als ein Function-call) implementiert werden kann. Und selbst wenn nicht, der Preis, welchen man für die Funktionalität bezahlt, ist mehr als angemessen. Stell dir vor, dass du auf jeder Zeile deine <code>if</code> s hinschreibst, welche dann auf mögliche Fehler testen sollen. Diese Variante wäre vermutlich <em>teurer</em> als Exceptions.</p>
<p>Was mich eher beunruhigen würde als die Kosten von Exceptions wäre die Tatsache, dass du soviele verschachtelte <code>try</code> - <code>catch</code> -Blöcke hast; insbesondere wenn diese wirklich so wie du in deinem Beispiel B lokal innerhalb einer Funktion verschachtelt hast. Normalerweise deutet sowas auf einen Designfehler hin - zu viele Exceptions werden geworfen bei jeder Gelegenheit. Vielleicht solltest du dir deshalb überlegen, wann Exceptions wirklich nötig sind, und wann ein Rückgabewert à la <code>false</code> die bessere Variante ist. Exceptions sollten, wie der Name ja bereits dezent andeutet, nur in Ausnahmefällen geworfen werden.</p>
<p>Abgesehen davon würde ich bei Performanceproblemen sicherlich nicht zuerst an C++-Sprachfeatures zurückschrauben, sondern versuchen, die Algorithmen zu optimieren. Das bringt normalerweise mehr und ist auch nachhaltiger <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/1614106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1614106</guid><dc:creator><![CDATA[*rant*]]></dc:creator><pubDate>Thu, 13 Nov 2008 13:20:15 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit bei geschachtelten try on Thu, 13 Nov 2008 13:57:11 GMT]]></title><description><![CDATA[<p>Danke für die Antwort.</p>
<blockquote>
<p>wäre die Tatsache, dass du soviele verschachtelte try-catch-Blöcke hast; insbesondere wenn diese wirklich so wie du in deinem Beispiel B lokal innerhalb einer Funktion verschachtelt hast.</p>
</blockquote>
<p>Die Beispiele waren nur um den Sachverhalt zu verdeutlichen, was ich mit &quot;verschachtelten try/catch&quot; meine. In Wirklichkeit geht es darum, dass ich eine Baumstruktur aufbaue und jeweils eine try/catch um den Code des Constructors lege:</p>
<pre><code class="language-cpp">CLASS_A::CLASS_A( ..., eA **ppxeA_GeworfeneException ) 
{
   try
   {
      throw eA();
   }
   catch( eA&amp; ea )
   {
      *ppxeA_GeworfeneException  = new eA() ;
   }
}
</code></pre>
<p>So wird keine exception aus dem Constructor &quot;hinaus&quot;geworfen, also das Object wirklich erstellt.</p>
<p>Die aufrufende Funktion reagiert darauf, dass *ppxea_GeworfeneException != null ist, und zerstört das Object, in dessen Constructor eine exception geworfen wurde (so stelle ich sicher, dass der Destructor aufgerufen wird).</p>
<pre><code class="language-cpp">try
{
   CLASS_A *pxA = new CLASS_A(..., &amp;pxeA_GeworfeneException ) ;

   if( pxeA_GeworfeneException != NULL )
   {
      delete pxA ;
      delete pxeA_GeworfeneException ;
      throw eA() ;
   }
}
catch( eA&amp; ea )
{
   // reagiere
}
</code></pre>
<p>Die Verschachtelung ergibt sich also aus der Baumstruktur und kann daher sehr tief sein.</p>
<p>Was haltet Ihr von diesem Design? Gibt es eine bessere Möglichkeit?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1614138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1614138</guid><dc:creator><![CDATA[kannmichnichterinnern]]></dc:creator><pubDate>Thu, 13 Nov 2008 13:57:11 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit bei geschachtelten try on Thu, 13 Nov 2008 14:00:43 GMT]]></title><description><![CDATA[<p>kannmichnichterinnern schrieb:</p>
<blockquote>
<p>Gibt es eine bessere Möglichkeit?</p>
</blockquote>
<p>Verwende RAII und wirf im Konstruktor, wenn es keinen Sinn macht, das Objekt fertig zu erzeugen. Von allen bereits initialisierten Membern wird der Destruktor aufgerufen, selbst wenn der Destruktor des Objekts selbst nicht aufgerufen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1614140</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1614140</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 13 Nov 2008 14:00:43 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit bei geschachtelten try on Thu, 13 Nov 2008 14:02:30 GMT]]></title><description><![CDATA[<p>kannmichnichterinnern schrieb:</p>
<blockquote>
<p>Was haltet Ihr von diesem Design? Gibt es eine bessere Möglichkeit?</p>
</blockquote>
<p>Unschön; zu grosser Aufwand, zu kleiner Nutzen.</p>
<p>LordJaxom schrieb:</p>
<blockquote>
<p>kannmichnichterinnern schrieb:</p>
<blockquote>
<p>Gibt es eine bessere Möglichkeit?</p>
</blockquote>
<p>Verwende RAII und wirf im Konstruktor, wenn es keinen Sinn macht, das Objekt fertig zu erzeugen. Von allen bereits initialisierten Membern wird der Destruktor aufgerufen, selbst wenn der Destruktor des Objekts selbst nicht aufgerufen wird.</p>
</blockquote>
<p>This <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1614143</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1614143</guid><dc:creator><![CDATA[*rant*]]></dc:creator><pubDate>Thu, 13 Nov 2008 14:02:30 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit bei geschachtelten try on Fri, 14 Nov 2008 05:37:01 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>kannmichnichterinnern schrieb:</p>
<blockquote>
<p>Gibt es eine bessere Möglichkeit?</p>
</blockquote>
<p>Verwende RAII und wirf im Konstruktor, wenn es keinen Sinn macht, das Objekt fertig zu erzeugen. Von allen bereits initialisierten Membern wird der Destruktor aufgerufen, selbst wenn der Destruktor des Objekts selbst nicht aufgerufen wird.</p>
</blockquote>
<p>Ok, ich werde mir das mal angucken. Aber im Moment bin ich etwas in Zeitdruck und mir geht es vorrangig darum die Geschwindigkeit des Programms zu erhöhen. Besteht zumindest die MÖGLICHKEIT, dass RAII mir dabei hilft?<br />
(Ansonsten lass ich das für das nächste Projekt.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1614479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1614479</guid><dc:creator><![CDATA[kannmichnichterinnern]]></dc:creator><pubDate>Fri, 14 Nov 2008 05:37:01 GMT</pubDate></item></channel></rss>