Mono uses zero cost exception handling, so setting up a try-catch handler has zero cost.<div><br></div><div>That&#39;s the theory, but using try-catch blocks have a few undesirable implications to control-flow.</div><div>The problem are variables that are used in the catch block, for example:</div>
<div><br></div><div>int x;</div><div>try {</div><div>  x = 1;</div><div>  MayThrow ();</div><div>  x = 2;</div><div>  MayThrow ();</div><div>  x = 3;</div><div>} catch (Exception) {</div><div>  Console.WriteLine (x);</div>
<div>}</div><div><div><br></div><div>On the above code, when we reach the catch block, we can&#39;t statically know which assignment was the last to execute, so we have</div><div>to make sure they all use the same storage - which is a very hard problem to solve.</div>
<div><br></div><div>Mono&#39;s current JIT takes the easy solution which is to mark all those variables as volatile, which has the unfortunate effect of producing</div><div>code outside the catch block that is quite worse than otherwise. So, EH has a very low overhead, but should not be used for those cases.</div>
<div><br></div><div>Now onto the null check. Such a null check will exploit a cpu feature known as branch prediction, which guesses the outcome of the</div><div>conditional jump. Since in the majority of the cases the value won&#39;t be null, the cpu can pretend the branch doesn&#39;t exist and keep executing</div>
<div>as it was not taken. This means the null check costs virtually nothing on a modern cpu.</div><div><br></div><div><br></div><div><br><div class="gmail_quote">On Thu, Mar 24, 2011 at 5:32 PM, Mikael Lyngvig <span dir="ltr">&lt;<a href="mailto:mikael@lyngvig.org">mikael@lyngvig.org</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Hi,<br>
<br>
I&#39;m not an expert on the JIT compiler and such, but I do know that in<br>
virtually all programming languages that support exception handling, the<br>
cost of a null-check is infinitesimal compared to the cost of setting up<br>
an exception handler.  On many systems, setting up a try-catch handler<br>
costs something like 200 instructions whereas the null check only costs<br>
one or two instructions.<br>
<br>
Cheers,<br>
Mikael<br>
<br>
Den <a href="tel:24-03-2011%2017">24-03-2011 17</a>:06, Steve Bjorg skrev:<br>
<div><div></div><div class="h5">&gt; Is the cost of the if-null check greater than setting up an exception catch handler?<br>
&gt;<br>
&gt; - Steve<br>
&gt;<br>
&gt; ---------------------------------<br>
&gt; Steve G. Bjorg<br>
&gt; MindTouch<br>
&gt; San Diego, CA<br>
&gt;<br>
&gt; <a href="tel:619.795.8459">619.795.8459</a> office<br>
&gt; <a href="tel:425.891.5913">425.891.5913</a> mobile<br>
&gt; <a href="http://twitter.com/bjorg" target="_blank">http://twitter.com/bjorg</a><br>
&gt;<br>
&gt; On Mar 24, 2011, at 9:00 AM, Miguel de Icaza wrote:<br>
&gt;<br>
&gt;&gt; Hello guys,<br>
&gt;&gt;<br>
&gt;&gt; Today in the shower I had an idea that I believe we could use to<br>
&gt;&gt; improve the performance of our class library code.<br>
&gt;&gt;<br>
&gt;&gt; Plenty of our class library code has code like this:<br>
&gt;&gt;<br>
&gt;&gt; void Foo (Something x)<br>
&gt;&gt; {<br>
&gt;&gt;     if (x == null)<br>
&gt;&gt;         throw new ArgumentNullException (&quot;x&quot;);<br>
&gt;&gt;     x.DoSomething ();<br>
&gt;&gt;     x.AndThenMore ();<br>
&gt;&gt; }<br>
&gt;&gt;<br>
&gt;&gt; Arguably, if this could be inlined, and the JIT could prove that x is<br>
&gt;&gt; not null, we would skip the first test, for example:<br>
&gt;&gt;<br>
&gt;&gt; Foo (new Something ());<br>
&gt;&gt;<br>
&gt;&gt; But this is the exception, in general, the JIT would not be able to<br>
&gt;&gt; know this kind of information for even trivial uses like:<br>
&gt;&gt;<br>
&gt;&gt; Foo (Bar.GetSomething ());<br>
&gt;&gt;<br>
&gt;&gt; Rendering the optimization not very effective.<br>
&gt;&gt;<br>
&gt;&gt; But what if we changed our code in Foo across our class libraries to<br>
&gt;&gt; do this instead:<br>
&gt;&gt;<br>
&gt;&gt; void Foo (Something x)<br>
&gt;&gt; {<br>
&gt;&gt;     try {<br>
&gt;&gt;         x.DoSomething ();<br>
&gt;&gt;     } catch (NullReferenceException e){<br>
&gt;&gt;         if (x == null)<br>
&gt;&gt;              throw new ArgumentNullException (&quot;x&quot;);<br>
&gt;&gt;         else<br>
&gt;&gt;               throw;<br>
&gt;&gt;     }<br>
&gt;&gt;     x.AndThenMore ();<br>
&gt;&gt; }<br>
&gt;&gt;<br>
&gt;&gt; This has the advantage that the test for the value of &quot;x&quot; being null<br>
&gt;&gt; is delayed until we actually need it.    The downside of course is<br>
&gt;&gt; that DoSomething could actually take other forms and might end up<br>
&gt;&gt; running code that we do not need before it touches x, for example,<br>
&gt;&gt; this would be a problem:<br>
&gt;&gt;<br>
&gt;&gt; // We should never add null values.<br>
&gt;&gt; void AddToCache (Something x)<br>
&gt;&gt; {<br>
&gt;&gt;     cache.Add (x);<br>
&gt;&gt; }<br>
&gt;&gt;<br>
&gt;&gt; void Foo (Something x)<br>
&gt;&gt; {<br>
&gt;&gt;       if (x == null)<br>
&gt;&gt;           throw new ArgumentNullException (&quot;x&quot;);<br>
&gt;&gt;       AddToCache (x);<br>
&gt;&gt; }<br>
&gt;&gt;<br>
&gt;&gt; If we rewrite the above code, we would end up with a bug like the one<br>
&gt;&gt; I described.<br>
&gt;&gt;<br>
&gt;&gt; Miguel<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; Mono-devel-list mailing list<br>
&gt;&gt; <a href="mailto:Mono-devel-list@lists.ximian.com">Mono-devel-list@lists.ximian.com</a><br>
&gt;&gt; <a href="http://lists.ximian.com/mailman/listinfo/mono-devel-list" target="_blank">http://lists.ximian.com/mailman/listinfo/mono-devel-list</a><br>
&gt; _______________________________________________<br>
&gt; Mono-devel-list mailing list<br>
&gt; <a href="mailto:Mono-devel-list@lists.ximian.com">Mono-devel-list@lists.ximian.com</a><br>
&gt; <a href="http://lists.ximian.com/mailman/listinfo/mono-devel-list" target="_blank">http://lists.ximian.com/mailman/listinfo/mono-devel-list</a><br>
&gt;<br>
<br>
_______________________________________________<br>
Mono-devel-list mailing list<br>
<a href="mailto:Mono-devel-list@lists.ximian.com">Mono-devel-list@lists.ximian.com</a><br>
<a href="http://lists.ximian.com/mailman/listinfo/mono-devel-list" target="_blank">http://lists.ximian.com/mailman/listinfo/mono-devel-list</a><br>
</div></div></blockquote></div><br></div></div>