<?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[catch missbrauchen]]></title><description><![CDATA[<p>Situation: Ich will solange irgendetwas berechnen, bis ich das Resultat gefunden habe. Den Fall habe ich öfters, beim Suchen in Datenstrukturen, beim Simulieren bis zu einer bestimmten Genauigkeit, etc.</p>
<p>Es gibt nun 2 Möglichkeiten, die Abbruchbedingung zu formulieren: Mit Exceptions oder mit true/false.</p>
<p>Mir wird immer gelehrt, Exceptions nur in Ausnahmefällen zu gebrauchen. In meinen Fällen würden sie den Code schöner und gleichzeitig schneller machen. Aber sie sind keine &quot;unerwarteten Ausnahmen&quot; im herkömmlichen Sinne mehr.</p>
<pre><code class="language-cpp">struct found {};
void f_(int s, int l, int r)
{
  if (r - l == 1) {
    if (s == l)
      throw found();
  } else {
    f_(s, l, (l+r)/2);
    f_(s, (l+r)/2, r);
  }
}
bool f(int s, int l, int r)
{
  try {
    f_(s,l,r);
  } catch (found&amp;) {
    return true;
  }
  return false;
}

bool g(int s, int l, int r)
{
  if (r - l == 1)
    return s == l;

  if (g(s, l, (l+r)/2)) return true;
  if (g(s, (l+r)/2, r)) return true;
  return false;
}

int main()
{
  int c,s,l,r;
  std::cin &gt;&gt; c &gt;&gt; s &gt;&gt; l &gt;&gt; r;

  if (c==0) std::cout &lt;&lt; std::boolalpha &lt;&lt; g(s,l,r) &lt;&lt; '\n'; 
  else      std::cout &lt;&lt; std::boolalpha &lt;&lt; f(s,l,r) &lt;&lt; '\n'; 
}
</code></pre>
<p>g() dauert 8.43s, f() dauert 6.82s.</p>
<p>Findet ihr das eine valide Option, Exceptions für solche Fälle zu missbrauchen, oder sollte man sie strikt nur wirkliche Ausnahmen einsetzen?</p>
<p>Wenn nein, wie kann ich die sonst Geschwindigkeit und den kurzen Code erreichen?<br />
Wenn ja, was ist das Kriterium? Es gibt noch viele weitere Fälle (erwartete Parserfehler, Protokollabbruch, Spezialfall x=0, etc.).</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/317985/catch-missbrauchen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 23 Jul 2026 20:47:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/317985.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 26 Jun 2013 23:05:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to catch missbrauchen on Wed, 26 Jun 2013 23:05:32 GMT]]></title><description><![CDATA[<p>Situation: Ich will solange irgendetwas berechnen, bis ich das Resultat gefunden habe. Den Fall habe ich öfters, beim Suchen in Datenstrukturen, beim Simulieren bis zu einer bestimmten Genauigkeit, etc.</p>
<p>Es gibt nun 2 Möglichkeiten, die Abbruchbedingung zu formulieren: Mit Exceptions oder mit true/false.</p>
<p>Mir wird immer gelehrt, Exceptions nur in Ausnahmefällen zu gebrauchen. In meinen Fällen würden sie den Code schöner und gleichzeitig schneller machen. Aber sie sind keine &quot;unerwarteten Ausnahmen&quot; im herkömmlichen Sinne mehr.</p>
<pre><code class="language-cpp">struct found {};
void f_(int s, int l, int r)
{
  if (r - l == 1) {
    if (s == l)
      throw found();
  } else {
    f_(s, l, (l+r)/2);
    f_(s, (l+r)/2, r);
  }
}
bool f(int s, int l, int r)
{
  try {
    f_(s,l,r);
  } catch (found&amp;) {
    return true;
  }
  return false;
}

bool g(int s, int l, int r)
{
  if (r - l == 1)
    return s == l;

  if (g(s, l, (l+r)/2)) return true;
  if (g(s, (l+r)/2, r)) return true;
  return false;
}

int main()
{
  int c,s,l,r;
  std::cin &gt;&gt; c &gt;&gt; s &gt;&gt; l &gt;&gt; r;

  if (c==0) std::cout &lt;&lt; std::boolalpha &lt;&lt; g(s,l,r) &lt;&lt; '\n'; 
  else      std::cout &lt;&lt; std::boolalpha &lt;&lt; f(s,l,r) &lt;&lt; '\n'; 
}
</code></pre>
<p>g() dauert 8.43s, f() dauert 6.82s.</p>
<p>Findet ihr das eine valide Option, Exceptions für solche Fälle zu missbrauchen, oder sollte man sie strikt nur wirkliche Ausnahmen einsetzen?</p>
<p>Wenn nein, wie kann ich die sonst Geschwindigkeit und den kurzen Code erreichen?<br />
Wenn ja, was ist das Kriterium? Es gibt noch viele weitere Fälle (erwartete Parserfehler, Protokollabbruch, Spezialfall x=0, etc.).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334694</guid><dc:creator><![CDATA[catchme]]></dc:creator><pubDate>Wed, 26 Jun 2013 23:05:32 GMT</pubDate></item><item><title><![CDATA[Reply to catch missbrauchen on Thu, 27 Jun 2013 06:18:01 GMT]]></title><description><![CDATA[<p>Die Funktionen sind nicht identisch, ein Vergleich ist deshalb nicht sinnvoll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334706</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334706</guid><dc:creator><![CDATA[EOP]]></dc:creator><pubDate>Thu, 27 Jun 2013 06:18:01 GMT</pubDate></item><item><title><![CDATA[Reply to catch missbrauchen on Thu, 27 Jun 2013 06:20:21 GMT]]></title><description><![CDATA[<p>catchme schrieb:</p>
<blockquote>
<p>Findet ihr das eine valide Option, Exceptions für solche Fälle zu missbrauchen, oder sollte man sie strikt nur wirkliche Ausnahmen einsetzen?</p>
</blockquote>
<p>Nein. Ja.</p>
<p>catchme schrieb:</p>
<blockquote>
<p>Wenn nein, wie kann ich die sonst Geschwindigkeit und den kurzen Code erreichen?</p>
</blockquote>
<p>Einen Profiler benutzen (Visual Studio, Valgrind/Cachegrind, Intel VTune...).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334707</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334707</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Thu, 27 Jun 2013 06:20:21 GMT</pubDate></item><item><title><![CDATA[Reply to catch missbrauchen on Thu, 27 Jun 2013 07:01:50 GMT]]></title><description><![CDATA[<p>EOP schrieb:</p>
<blockquote>
<p>Die Funktionen sind nicht identisch, ein Vergleich ist deshalb nicht sinnvoll.</p>
</blockquote>
<p>Sie sind identisch.</p>
<p>theta schrieb:</p>
<blockquote>
<p>catchme schrieb:</p>
<blockquote>
<p>Wenn nein, wie kann ich die sonst Geschwindigkeit und den kurzen Code erreichen?</p>
</blockquote>
<p>Einen Profiler benutzen (Visual Studio, Valgrind/Cachegrind, Intel VTune...).</p>
</blockquote>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334714</guid><dc:creator><![CDATA[catchme]]></dc:creator><pubDate>Thu, 27 Jun 2013 07:01:50 GMT</pubDate></item><item><title><![CDATA[Reply to catch missbrauchen on Thu, 27 Jun 2013 07:52:12 GMT]]></title><description><![CDATA[<p>Hast du ein konkrete Frage zu meiner Antwort bezüglich Profiler?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334727</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334727</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Thu, 27 Jun 2013 07:52:12 GMT</pubDate></item><item><title><![CDATA[Reply to catch missbrauchen on Thu, 27 Jun 2013 07:55:33 GMT]]></title><description><![CDATA[<p>catchme schrieb:</p>
<blockquote>
<p>EOP schrieb:</p>
<blockquote>
<p>Die Funktionen sind nicht identisch, ein Vergleich ist deshalb nicht sinnvoll.</p>
</blockquote>
<p>Sie sind identisch.</p>
</blockquote>
<p>Nein, sind sie nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334728</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334728</guid><dc:creator><![CDATA[MichelRT]]></dc:creator><pubDate>Thu, 27 Jun 2013 07:55:33 GMT</pubDate></item><item><title><![CDATA[Reply to catch missbrauchen on Thu, 27 Jun 2013 07:57:59 GMT]]></title><description><![CDATA[<p>catchme schrieb:</p>
<blockquote>
<p>EOP schrieb:</p>
<blockquote>
<p>Die Funktionen sind nicht identisch, ein Vergleich ist deshalb nicht sinnvoll.</p>
</blockquote>
<p>Sie sind identisch.</p>
</blockquote>
<p>Nein, das sind sie nicht. Vielleicht sind sie das von der Signatur und vom Verhalten.</p>
<blockquote>
<p>theta schrieb:</p>
<blockquote>
<p>catchme schrieb:</p>
<blockquote>
<p>Wenn nein, wie kann ich die sonst Geschwindigkeit und den kurzen Code erreichen?</p>
</blockquote>
<p>Einen Profiler benutzen (Visual Studio, Valgrind/Cachegrind, Intel VTune...).</p>
</blockquote>
<p>?</p>
</blockquote>
<p>Edit: Was rede ich da. Jetzt verstehe ich theta schon sowieso nicht - was hat da ein Profiler verloren (ich dachte es geht um Geschwindigkeitsmessung)</p>
<blockquote>
<p>g() dauert 8.43s, f() dauert 6.82s.</p>
</blockquote>
<p>Optimierungslevel?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334729</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334729</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 27 Jun 2013 07:57:59 GMT</pubDate></item><item><title><![CDATA[Reply to catch missbrauchen on Thu, 27 Jun 2013 08:47:08 GMT]]></title><description><![CDATA[<pre><code>bool h(int s, int l, int r)
{
    return l&lt;s &amp;&amp; s&lt;r;
}
</code></pre>
<p>Dauert bei mir 0.00 s (auf 2 Stellen genau <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="😃"
    /> ). Ist O(1) und nicht O(ld n), wie bei Deinem Ansatz</p>
<p>catchme schrieb:</p>
<blockquote>
<p>Wenn nein, wie kann ich die sonst Geschwindigkeit und den kurzen Code erreichen?</p>
</blockquote>
<p>Mal abgesehen davon, dass g kuerzer und leichter zu lesen ist: Rekursion ist hier sicher nicht der Beste Weg das zu loesen. Du verlierst mit den ganzen rekursiven Aufrufen viel mehr Zeit, als Du mit Deinem catch gewinnen kannst. Wahrscheinlich liegt da auch der Gewinn des catch gegenueber dem &quot;normalen&quot; Funktionsaufruf: Beim Ruecksprung wird die Zeit gespart.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334737</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334737</guid><dc:creator><![CDATA[nichtrekursiv]]></dc:creator><pubDate>Thu, 27 Jun 2013 08:47:08 GMT</pubDate></item><item><title><![CDATA[Reply to catch missbrauchen on Thu, 27 Jun 2013 10:05:33 GMT]]></title><description><![CDATA[<p>Nun, habe natuerlich mal von einer Suche in Baemen gehoert, die mittels Exception bei gefundenem Eintrag auffhoerte. War schneller und war in Java. C++ bietet fuer non-local-exit als einziges Mittel nur Exceptions an. Schade, andere Sprachen bieten Continuations :). Da hier keine lokalen Objekte erzeugt werden, koennte man was mit setjmp, longjmp machen. Vielleicht bietet Boost.Context auch was an. Dazu muesste aber das ganze Problem dargestellt werden und entsprechend nachgemessen werden.</p>
<p>Btw.: Ich mag call/cc. <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>Rekursion ist hier sicher nicht der Beste Weg das zu loesen. Du verlierst mit den ganzen rekursiven Aufrufen viel mehr Zeit, als Du mit Deinem catch gewinnen kannst.</p>
</blockquote>
<p>Es fehlen Begruendungen fuer deine Aussagen. Normalerweise schafft der Compiler die Rekursion aufzuloesen.</p>
<p>Ansonsten ist die Impelementierung natuerlich suboptimal:</p>
<pre><code class="language-cpp">bool g(int s, int l, int r) 
{ 
  if (r - l == 1) 
    return s == l; 

  return g(s, l, (l+r)/2)) || g(s, (l+r)/2, r);
}
</code></pre>
<p>Und wenn es sowieso folgendes die Loesung ist:</p>
<pre><code class="language-cpp">bool h(int s, int l, int r) 
{ 
    return l&lt;s &amp;&amp; s&lt;r; 
}
</code></pre>
<p>Wieso dann ueberhaupt den ganzen Aufwand?</p>
<blockquote>
<p>g() dauert 8.43s, f() dauert 6.82s</p>
</blockquote>
<p>Es fehlen Angaben zu Compileroptionen.</p>
<blockquote>
<p>Wenn nein, wie kann ich die sonst Geschwindigkeit und den kurzen Code erreichen?</p>
</blockquote>
<p>Durch nachdenken.</p>
<p>Ansonsten: Hier wuerde ich auf Exceptions verzichten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334738</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 27 Jun 2013 10:05:33 GMT</pubDate></item><item><title><![CDATA[Reply to catch missbrauchen on Thu, 27 Jun 2013 10:18:50 GMT]]></title><description><![CDATA[<blockquote>
<p>Findet ihr das eine valide Option, Exceptions für solche Fälle zu missbrauchen, oder sollte man sie strikt nur wirkliche Ausnahmen einsetzen?</p>
</blockquote>
<p>Wenn ...<br />
* der Speedup wirklich merkbar ist,<br />
* der Speedup wirklich gebraucht wird,<br />
* die Funktion, inklusive aller von ihr (direkt oder indirekt) aufgerufenen Funktionen ausreichend klein (überschaubar) ist,<br />
* man es gut dokumentiert,<br />
* es die Ausnahme bleibt und nicht an 100 Stellen wiederholt wird<br />
und<br />
* es mit vertretbarem Aufwand nicht möglich ist eine &quot;bessere&quot; Lösung zu bauen,<br />
dann würde ich diese &quot;Hack&quot; nicht als grundsätzlich verwerflich einstufen.</p>
<p>Aber versuch mal ein Beispiel zu machen das auch wirklich irgendwas tut was man nicht trivial zu einer O(1) Funktion zusammenkürzen kann. Würde mich eher wundern wenn der Unterschied dann immer noch so deutlich ausfallen würde.</p>
<blockquote>
<p>Wenn nein, wie kann ich die sonst Geschwindigkeit und den kurzen Code erreichen?</p>
</blockquote>
<p>Die Funktion so umschreiben dass sie iterativ statt rekursiv arbeitet. Dadurch wird die vermutlich auch um einiges schneller - u.U. sogar schneller als die Exception-Trick Variante.</p>
<blockquote>
<p>Wenn ja, was ist das Kriterium? Es gibt noch viele weitere Fälle (erwartete Parserfehler, Protokollabbruch, Spezialfall x=0, etc.).</p>
</blockquote>
<p>Ich würde das immer im Einzelfall entscheiden.<br />
Code der im Normalbetrieb keine Exceptions wirft ist u.A. angenehmer zu debuggen als Code wo dauernd irgendwelche Exceptions rumfliegen.<br />
Und natürlich verletzt man mit solchen Tricks das principle of least astonishment, was generell keine gute Idee ist.</p>
<p>Bevor man sich aber das Leben zur Hölle macht, nur weil man auf den &quot;Misbrauch&quot; von Exceptions/setjmp-longjmp/... verzichtet ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334747</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 27 Jun 2013 10:18:50 GMT</pubDate></item><item><title><![CDATA[Reply to catch missbrauchen on Thu, 27 Jun 2013 11:07:37 GMT]]></title><description><![CDATA[<p>Also ich breche Schleifen mit break ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334755</guid><dc:creator><![CDATA[Helmut.Jakoby]]></dc:creator><pubDate>Thu, 27 Jun 2013 11:07:37 GMT</pubDate></item><item><title><![CDATA[Reply to catch missbrauchen on Thu, 27 Jun 2013 11:54:09 GMT]]></title><description><![CDATA[<p>Welche Schleife?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334764</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 27 Jun 2013 11:54:09 GMT</pubDate></item></channel></rss>