<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>Rodrigo,</div><div><br></div><div>Thanks for the detailed explanation. &nbsp;That's really good to know!</div><br><div>
<span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">- Steve</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><br class="khtml-block-placeholder"></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">--------------</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">Steve G. Bjorg</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><a href="http://mindtouch.com">http://mindtouch.com</a></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><a href="http://twitter.com/bjorg">http://twitter.com/bjorg</a></div></span></span></div></span></div></span></div></span></div></span></div></span></span>
</div>

<br><div><div>On Mar 24, 2011, at 9:51 AM, Rodrigo Kumpera wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">Mono uses zero cost exception handling, so setting up a try-catch handler has zero cost.<div><br></div><div>That'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>&nbsp;&nbsp;x = 1;</div><div>&nbsp;&nbsp;MayThrow ();</div><div>&nbsp;&nbsp;x = 2;</div><div>&nbsp;&nbsp;MayThrow ();</div><div>&nbsp;&nbsp;x = 3;</div><div>} catch (Exception) {</div><div>&nbsp;&nbsp;Console.WriteLine (x);</div>
<div>}</div><div><div><br></div><div>On the above code, when we reach the catch block, we can'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's current JIT takes the easy solution which is&nbsp;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&nbsp;jump. Since in the majority of the cases the value won't be null, the cpu can pretend the branch doesn'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'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. &nbsp;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; &nbsp; &nbsp; if (x == null)<br>
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp; throw new ArgumentNullException ("x");<br>
&gt;&gt; &nbsp; &nbsp; x.DoSomething ();<br>
&gt;&gt; &nbsp; &nbsp; 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; &nbsp; &nbsp; try {<br>
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp; x.DoSomething ();<br>
&gt;&gt; &nbsp; &nbsp; } catch (NullReferenceException e){<br>
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp; if (x == null)<br>
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw new ArgumentNullException ("x");<br>
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp; else<br>
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw;<br>
&gt;&gt; &nbsp; &nbsp; }<br>
&gt;&gt; &nbsp; &nbsp; x.AndThenMore ();<br>
&gt;&gt; }<br>
&gt;&gt;<br>
&gt;&gt; This has the advantage that the test for the value of "x" being null<br>
&gt;&gt; is delayed until we actually need it. &nbsp; &nbsp;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; &nbsp; &nbsp; cache.Add (x);<br>
&gt;&gt; }<br>
&gt;&gt;<br>
&gt;&gt; void Foo (Something x)<br>
&gt;&gt; {<br>
&gt;&gt; &nbsp; &nbsp; &nbsp; if (x == null)<br>
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new ArgumentNullException ("x");<br>
&gt;&gt; &nbsp; &nbsp; &nbsp; 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>
_______________________________________________<br>Mono-devel-list mailing list<br><a href="mailto:Mono-devel-list@lists.ximian.com">Mono-devel-list@lists.ximian.com</a><br>http://lists.ximian.com/mailman/listinfo/mono-devel-list<br></blockquote></div><br></body></html>