<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.iis.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:cs="http://blogs.iis.net/"><channel><title>Tobin Titus Blog : Performance</title><link>http://blogs.iis.net/tobintitus/archive/tags/Performance/default.aspx</link><description>Tags: Performance</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>IIS Security – Past and Present</title><link>http://blogs.iis.net/tobintitus/archive/2009/04/28/iis-security-past-and-present.aspx</link><pubDate>Tue, 28 Apr 2009 08:24:00 GMT</pubDate><guid isPermaLink="false">50bcf3b4-f6fe-4638-adff-0c150e922e99:3122704</guid><dc:creator>TobinTitus</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.iis.net/tobintitus/rsscomments.aspx?PostID=3122704</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.iis.net/tobintitus/commentapi.aspx?PostID=3122704</wfw:comment><comments>http://blogs.iis.net/tobintitus/archive/2009/04/28/iis-security-past-and-present.aspx#comments</comments><description>&lt;p&gt;This topic has been covered many times both by Microsoft and non-Microsoft employees. However, I’ve recently been asked what the main features of IIS 7 are and have seen a great deal of misinformation about IIS security on twitter, blog posts and forums. &lt;/p&gt;  &lt;p&gt;I think, therefore, the issue deserves yet another look. In this post, I’m going to go over security in the past for IIS and then move on to talk about security features in IIS 7. These are not in any particular order. This post is not meant to diminish the many thoughtful works already created by others – both complimentary and critical. This is just meant to bring the subject back up for discussion again in hopes that you can be properly equipped with the decision making information you may need.&lt;/p&gt;  &lt;h2&gt;Ghosts of IIS Security Past&lt;/h2&gt;  &lt;p&gt;The reason for so much misinformation about the current state of security in IIS is likely due to the earned reputation the product had in versions previous to IIS 6.0. A quick search on the web for &lt;a href="http://search.live.com/results.aspx?q=IIS+5+security+vulnerability&amp;amp;src=IE-SearchBox&amp;amp;Form=IE8SRC" target="_blank"&gt;IIS 5 security vulnerabilities&lt;/a&gt; may be like a walk down memory lane for some of the more veteran administrators and IT staff across the globe. The search results are littered with critical vulnerabilities related to buffer overflows, ISAPI extensions, exploits on rarely-used features, or features that were available by a default installation. We are haunted by names like “&lt;a href="http://en.wikipedia.org/wiki/Code_Red_(computer_worm)" target="_blank"&gt;Code Red&lt;/a&gt;” and “&lt;a href="http://en.wikipedia.org/wiki/Nimda" target="_blank"&gt;Nimda&lt;/a&gt;”. I don’t know about you, but those very names send shivers down my spine. I was consulting as a developer and web administrator for a very large property management company when these hit. We were lucky enough to avoid these as we had patched our services. That said, many whom I did business with on a regular basis were not very happy. So, to be clear, I feel the misinformation that is spread today is built on an element of experience with previous versions. Secunia reports &lt;a href="http://secunia.com/advisories/product/39/" target="_blank"&gt;16 advisories and 6 vulnerabilities&lt;/a&gt; with IIS 5.&amp;#160; And so started the reputation , perhaps deservedly so, that IIS was not secure unless you really knew what you were doing with security.&lt;/p&gt;  &lt;p&gt;Bill Gates was apparently visited by the ghosts of security past, present and future when he laid his head on his pillow January 14th, 2002. I say that because on January 15th, 2002 Mr. Gates sent out the &lt;a href="http://www.wired.com/techbiz/media/news/2002/01/49826" target="_blank"&gt;now-famous trustworthy computing memo&lt;/a&gt; to every employee at Microsoft.&amp;#160; This set off a major revamp of products from the ground up. Standards were set for test planning and testing. Writing Secure Code was mandatory reading for every Microsoft developer and tester. The results have been staggering.&lt;/p&gt;  &lt;p&gt;Security drastically improved in Microsoft products over the years, and IIS was definitely no exception to this. IIS 6 saw &lt;a href="http://secunia.com/advisories/product/1438/" target="_blank"&gt;5 security advisories and 4 vulnerabilities&lt;/a&gt; reported since 2003. Not to get ahead of myself, but IIS 7 has &lt;a href="http://secunia.com/advisories/product/17543/" target="_blank"&gt;exactly 1 advisor and 1 vulnerability&lt;/a&gt; from Secunia. Compare this against Apache 2.0.x which has had &lt;a href="http://secunia.com/advisories/product/73/" target="_blank"&gt;39 advisories and 23 vulnerabilities&lt;/a&gt; (4 of which are still unpatched as of this writing) and Apache 2.2.x which has had &lt;a href="http://secunia.com/advisories/product/9633/" target="_blank"&gt;10 advisories and 16 vulnerabilities&lt;/a&gt; (2 of which are still unpatched as of this writing) in the same period.&amp;#160; Now I have seen attempts (&lt;a href="http://googleonlinesecurity.blogspot.com/2007/06/web-server-software-and-malware.html" target="_blank"&gt;[1]&lt;/a&gt;, &lt;a href="http://blog.washingtonpost.com/securityfix/2007/05/cyber_crooks_hijack_activities_1.html" target="_blank"&gt;[2]&lt;/a&gt;) to quantify or otherwise explain these numbers further. You can read those articles for yourself and determine how much weight you want to give them. However you skew it, the facts should speak for themselves – IIS has dramatically improved and taken a leadership roll in security in IIS 6 and 7. Our ghost of IIS past still haunts the product’s reputation today, despite obvious strides taken. Even if you feel you like Apache better I think it is only fair to give credit where it is due. &lt;/p&gt;  &lt;h2&gt;Improvements in IIS 6&lt;/h2&gt;  &lt;p&gt;The IIS team took the four tenants of Microsoft’s Trustworthy Computing initiative to heart: Secure by Design, Secure by Default, Secure in Deployment and Secure Communication. Since we are already on the next version, I won’t spend a great deal of time talking about the security improvements in the last version other than a brief overview so you know how they relate to changes in our current version, IIS 7. &lt;/p&gt;  &lt;p&gt;IIS 6 took vast strides to improve security. During upgrade installations, IIS 6 was disabled by default if the previous server had not been secured by the &lt;a href="http://blog.washingtonpost.com/securityfix/2007/05/cyber_crooks_hijack_activities_1.html" target="_blank"&gt;IIS lockdown tool&lt;/a&gt;. The architecture was completely revamped to separate kernel-mode HTTP listening from user-mode application execution. Changes were made to application pools, authentication, access control, encryption and certificate handling, auditing, logging and patch management that made the product far superior to its predecessors. You can find a detailed list of these features on &lt;a href="http://technet.microsoft.com/en-us/library/cc736369.aspx" target="_blank"&gt;TechNet&lt;/a&gt;.&amp;#160; SecurityFocus did a comparison of these features in &lt;a href="http://www.securityfocus.com/infocus/1765" target="_blank"&gt;March of 2004&lt;/a&gt;.Server Watch wrote an article in &lt;a href="http://www.serverwatch.com/tutorials/article.php/3294371" target="_blank"&gt;December of 2003&lt;/a&gt;. By most accounts, everything accomplished in IIS 6 was a huge step in the right direction.&lt;/p&gt;  &lt;p&gt;Despite the massive steps already taken in IIS6, IIS 7 took these all a bit further. Let’s go ahead and investigate these now.&lt;/p&gt;  &lt;h2&gt;Improvements in IIS 7.x&lt;/h2&gt;  &lt;h3&gt;Customizable Installation&lt;/h3&gt;  &lt;p&gt;Continuing with the tenant of being secure in deployment, IIS 7 has made installation a wonder to behold. In IIS 6, you could reduce your attack surface by disabling features native to web server. However, these features were still loaded into the process. This carried not only a security factor, but also a performance and memory footprint issue.&amp;#160; IIS 7 has a completely modular architecture. That means that features which you do not want are not only NOT loaded into the process, you can leave the bits for those features off of your disk completely. &lt;/p&gt;  &lt;h3&gt;Limitable Attack Surface&lt;/h3&gt;  &lt;p&gt;This is a bit dubious and is essentially part of the customizable installation. By reducing the modules that are available on disk or loaded into a process, you significantly reduce the attack surface for your specialized web servers. If all you intend to do is serve static content with caching and no default documents, you can simply install the static file handler and caching module and leave the rest of the IIS modules off of your server. Additional controls and limitations will also reduce your attack surface and I’ll cover those below.&lt;/p&gt;  &lt;h3&gt;IUSR account&lt;/h3&gt;  &lt;p&gt;Anyone who has tried to migrate an IIS installation from one machine to another or attempted to recover your installation on a new machine, previous to IIS 7, has likely run into an issue with the local “IUSR_&amp;lt;machine_name&amp;gt;” account.&amp;#160; IIS 7 now uses a built-in IUSR account that allows you to easily copy your security settings from one machine to the next. This is great news for those using distributed configuration in web farms, recovery, restoration, or replication.&lt;/p&gt;  &lt;h3&gt;IIS_IUSRS group&lt;/h3&gt;  &lt;p&gt;IIS 6 introduced the IIS_WPG group. Application pool security identities had to be assigned to this group in order to host the w3wp.exe process. Like the IUSR account, IIS 7 now creates a built-in security group (IIS_IUSRS) and assigns application pool identities to the group automatically. You can find more information about the built-in user and built-in group for IIS 7 on IIS.NET (&lt;a href="http://learn.iis.net/page.aspx/140/understanding-the-built-in-user-and-group-accounts-in-iis-7/." target="_blank"&gt;Understanding the Built-In User and Group Accounts in IIS 7.0&lt;/a&gt;). &lt;/p&gt;  &lt;h3&gt;ASP.NET / IIS Unified Security Architecture&lt;/h3&gt;  &lt;p&gt;Previous versions of IIS did not provide a unified approach to security with ASP.NET. The IIS 7 unified request pipeline that supports both Windows and non-Windows principals and provides one place to do all authentication and authorization. Apart from simplification and performance improvements, this also reduces the attack surface and allows for greater flexibility in authentication / authorization scenarios with custom modules.&lt;/p&gt;  &lt;h3&gt;Request Filtering / URL Rewriting&lt;/h3&gt;  &lt;p&gt;IIS 7.0 includes a request filtering module that is based on the URLScan ISAPI Filter for IIS 6.0. The module helps you tighten security of your Web servers. &lt;/p&gt;  &lt;p&gt;The IIS team has also released an add-on URL rewrite module for IIS 7.0, which provides functionality for rule-based URL manipulation. Even though the primary purpose of the URL rewrite module is to rewrite URL paths for requests, the rewrite module can also be used as a security enforcement tool that helps prevent access to Web site content.&lt;/p&gt;  &lt;h3&gt;Application Pool Identities&lt;/h3&gt;  &lt;p&gt;On top of Application Pool Isolation, IIS introduces a new security feature in Service Pack 2 of Windows Server 2008 and Windows Vista. It's called Application Pool Identities. Application Pool Identities allows you to run Application Pools under an unique account without having to create and manage domain or local accounts. The name of the Application Pool account corresponds to the name of the Application Pool. &lt;/p&gt;  &lt;h3&gt;Kernel mode SSL&lt;/h3&gt;  &lt;p&gt;The implementation of SSL has changed from IIS 6.0 to IIS 7.0.&amp;#160; On Windows Server 2003, all SSL configuration was stored in the IIS metabase and encryption/decryption happened in user mode (required a lot of kernel/user mode transitions).&amp;#160; On Windows Vista and Windows Server® 2008, HTTP.sys handles SSL encryption/decryption in kernel mode, resulting in up to 20% better performance for secure connections.&amp;#160; &lt;/p&gt;  &lt;h3&gt;Configuration Improvements&lt;/h3&gt;  &lt;p&gt;IIS 7.0 allows locking and unlocking configuration settings in various levels and scopes. Locking down configuration means that it cannot be overridden (or set at all) at lower levels in the hierarchy. Unlocking configuration can only be done at the level where it was locked. This is useful, for example, when creating different configuration for different sites or paths, and only some of sites and paths are allowed to override it. Locking can be done at the section level or for specific elements, attributes, collection elements and collection directives within sections.&lt;/p&gt;  &lt;h3&gt;Dynamic IP Restriction&lt;/h3&gt;  &lt;p&gt;IIS 7 provides a new module that allows dynamic, temporary IP address restriction. This module prevents brute force attacks and HTTP clients that make unusually high number of concurrent requests or a large number of requests over a short period of time.&lt;/p&gt;  &lt;h2&gt;Summary&lt;/h2&gt;  &lt;p&gt;A verbose list of security features in IIS 6 and IIS 7 might be nearly impossible. Apart from the obvious features, there were numerous improvements to code made over these two versions that make the product far more secure than IIS 5 and earlier. That said, this should give you a summary start on information. I’ve listed some reference documents that may help you understand these features better.&amp;#160; In general, I would encourage you to ask questions of the product team and or other users on the &lt;a href="http://forums.iis.net/" target="_blank"&gt;IIS.NET forums&lt;/a&gt; if you hear something that sounds negative regarding IIS. If the feedback is true, the product team has the benefit of improving the next release. If the feedback is unfounded, the product team has the benefit of helping you find the information you need to make an informed decision. &lt;/p&gt;  &lt;h2&gt;See Also&lt;/h2&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://channel9.msdn.com/posts/scobleizer/Brent-Hill-and-Roger-Grimes-Chatting-about-IIS-7s-security/"&gt;&lt;strong&gt;Brent Hill and Roger Grimes - Chatting about IIS 7's security&lt;/strong&gt;&lt;/a&gt; (From Sept. 2005)&lt;/li&gt;    &lt;li&gt;&lt;a href="http://channel9.msdn.com/shows/TechNet+Radio/TechNet-radio-Learn-about-the-IIS7-Security-features-and-benefits/" target="_blank"&gt;&lt;strong&gt;TechNet radio: Learn about the IIS7 Security features and benefits&lt;/strong&gt;&lt;/a&gt;&amp;#160;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.gartner.com/DisplayDocument?doc_cd=125453" target="_blank"&gt;&lt;strong&gt;Management Update: IIS Is No Longer the Problem in Web Server Security&lt;/strong&gt;&lt;/a&gt; (Gartner)&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/emea/spotlight/sessionh.aspx?videoid=568&amp;amp;PUID=00034001826C5CC7" target="_blank"&gt;&lt;strong&gt;IIS 7 Security: Less Exposure, Greater Control&lt;/strong&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc731278.aspx" target="_blank"&gt;&lt;strong&gt;TechNet: Configure Web Server Security&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://learn.iis.net/page.aspx/88/configuring-security/" target="_blank"&gt;&lt;strong&gt;IIS.NET : Configuring Security&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://learn.iis.net/page.aspx/139/iis7-security-improvements/" target="_blank"&gt;&lt;strong&gt;IIS.NET : IIS Security Improvements&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://learn.iis.net/page.aspx/548/using-dynamic-ip-restrictions/" target="_blank"&gt;&lt;strong&gt;Using Dynamic IP Restrictions&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.iis.net/ConfigReference/system.webServer/security/requestFiltering" target="_blank"&gt;&lt;strong&gt;IIS.NET Configuration Reference: Request Filtering&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=3122704" width="1" height="1"&gt;</description><category domain="http://blogs.iis.net/tobintitus/archive/tags/Performance/default.aspx">Performance</category><category domain="http://blogs.iis.net/tobintitus/archive/tags/IIS+7/default.aspx">IIS 7</category><category domain="http://blogs.iis.net/tobintitus/archive/tags/Installation/default.aspx">Installation</category><category domain="http://blogs.iis.net/tobintitus/archive/tags/Application+Pools/default.aspx">Application Pools</category><category domain="http://blogs.iis.net/tobintitus/archive/tags/IIS+5.1/default.aspx">IIS 5.1</category><category domain="http://blogs.iis.net/tobintitus/archive/tags/IIS+6/default.aspx">IIS 6</category><category domain="http://blogs.iis.net/tobintitus/archive/tags/IIS/default.aspx">IIS</category><category domain="http://blogs.iis.net/tobintitus/archive/tags/configuration/default.aspx">configuration</category><category domain="http://blogs.iis.net/tobintitus/archive/tags/Logging/default.aspx">Logging</category><category domain="http://blogs.iis.net/tobintitus/archive/tags/URL+Rewriter/default.aspx">URL Rewriter</category><category domain="http://blogs.iis.net/tobintitus/archive/tags/Security/default.aspx">Security</category></item><item><title>Adding performance</title><link>http://blogs.iis.net/tobintitus/archive/2006/11/30/adding-performance.aspx</link><pubDate>Thu, 30 Nov 2006 11:38:00 GMT</pubDate><guid isPermaLink="false">50bcf3b4-f6fe-4638-adff-0c150e922e99:1481697</guid><dc:creator>TobinTitus</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.iis.net/tobintitus/rsscomments.aspx?PostID=1481697</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.iis.net/tobintitus/commentapi.aspx?PostID=1481697</wfw:comment><comments>http://blogs.iis.net/tobintitus/archive/2006/11/30/adding-performance.aspx#comments</comments><description>&lt;P&gt;Some of you may have found the title to this blog post as amusing as I do.&amp;nbsp; Throughout my career, I've been called into many a meeting asking that I "add" performance to a complete or nearly-complete product.&amp;nbsp;No matter how many scowls I got, I could never resist joking about just adding the IPerformance interface.&amp;nbsp; "And, while you are at it, just add the IScalable one too", I would quip.&amp;nbsp;(OK, I know some of you are doing searches for these interfaces -- don't bother). Laugh as hard as I may, I'm embarrassed to say that I am trying to do this very thing now.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;A few weeks ago, I started playing around with a &lt;EM&gt;small&lt;/EM&gt; sample that shows off some of the fun features of IIS 7.&amp;nbsp;As I started coding, I added more features to the sample. Scope creep is a no-no, but this was something I was doing on my own time so I didn't have a problem with it.&amp;nbsp; However, the sample got so large that I had to actually stop and design a public API to support it.&amp;nbsp; By the time I was done, my "sample" had a set of providers, a common API, localization support, utilities, and most notably, performance issues.&lt;/P&gt;
&lt;P&gt;Last year on my personal blog, I talked about "&lt;A class="" href="http://codemilitia.com/blogs/tobin.titus/archive/2005/08/12/71.aspx" target=_blank&gt;engineering for usability&lt;/A&gt;".&amp;nbsp; In that post, I declared that the simplest design is sometimes (and probably most often) the best approach.&amp;nbsp; That said, performance should have been considered very early on, and the sample should have been kept simple.&amp;nbsp; Performance, as many of you know, is not something you add as an&amp;nbsp;afterthought.&amp;nbsp; Starting&amp;nbsp;my sample the way I did, I never considered&amp;nbsp;code performance to be an issue.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Now I'm forced to decide:&amp;nbsp; do I scale back my sample knowing full well that it doesn't have a security model or provide easy extensibility, or do I redesign the sample with the current feature set and design for performance up front?&amp;nbsp; I'm leaning toward the latter despite reciting "keep it simple, stupid" in my head over and over again.&lt;/P&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=1481697" width="1" height="1"&gt;</description><category domain="http://blogs.iis.net/tobintitus/archive/tags/Performance/default.aspx">Performance</category><category domain="http://blogs.iis.net/tobintitus/archive/tags/IIS+7/default.aspx">IIS 7</category></item><item><title>Improving code performance</title><link>http://blogs.iis.net/tobintitus/archive/2006/06/06/improving-code-performance.aspx</link><pubDate>Tue, 06 Jun 2006 20:40:00 GMT</pubDate><guid isPermaLink="false">50bcf3b4-f6fe-4638-adff-0c150e922e99:1307054</guid><dc:creator>TobinTitus</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.iis.net/tobintitus/rsscomments.aspx?PostID=1307054</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.iis.net/tobintitus/commentapi.aspx?PostID=1307054</wfw:comment><comments>http://blogs.iis.net/tobintitus/archive/2006/06/06/improving-code-performance.aspx#comments</comments><description>&lt;P&gt;&lt;FONT face=Arial size=2&gt;Recently, an old co-worker contacted me to ask me a question about code performance. Specifically, he was emitting IL from his code and had some questions about some of the opcode usage he witnessed when viewing the IL of some compiled assemblies.&amp;nbsp; The question was based on a simple application he wrote in C#, compiled, and disassembled.&amp;nbsp; He did this&amp;nbsp;to see how the C# compiler produced IL and give him clues in how he should emit IL.&amp;nbsp; The function in question was as follows:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;FONT color=blue&gt;public object&lt;/FONT&gt; GetProp(&lt;FONT color=blue&gt;string&lt;/FONT&gt; name) &lt;BR&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=blue&gt;if&lt;/FONT&gt; (name == &lt;FONT color=maroon&gt;"X"&lt;/FONT&gt;)&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;return this&lt;/FONT&gt;.X;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=blue&gt;return null;&lt;BR&gt;} &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Now, the code obviously isn't meant to do anything other than lend some insight into the IL.&amp;nbsp; Compiling to 'debug' the following IL was produced.&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face=Fixedsys size=2&gt;&lt;BR&gt;.method public hidebysig instance object &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetProp(string name) cil managed&lt;BR&gt;{&lt;BR&gt;// Code size&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 35 (0x23)&lt;BR&gt;.maxstack&amp;nbsp; 2&lt;BR&gt;.locals init ([0] object CS$1$0000,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [1] bool CS$4$0001)&lt;BR&gt;IL_0000:&amp;nbsp; nop&lt;BR&gt;IL_0001:&amp;nbsp; ldarg.1&lt;BR&gt;IL_0002:&amp;nbsp; ldstr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "X"&lt;BR&gt;IL_0007:&amp;nbsp; call&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool [mscorlib]System.String::op_Equality(string, string)&lt;BR&gt;IL_000c:&amp;nbsp; ldc.i4.0&lt;BR&gt;IL_000d:&amp;nbsp; ceq&lt;BR&gt;IL_000f:&amp;nbsp; stloc.1&lt;BR&gt;IL_0010:&amp;nbsp; ldloc.1&lt;BR&gt;IL_0011:&amp;nbsp; brtrue.s&amp;nbsp;&amp;nbsp; IL_001d&lt;BR&gt;IL_0013:&amp;nbsp; nop&lt;BR&gt;IL_0014:&amp;nbsp; ldarg.0&lt;BR&gt;IL_0015:&amp;nbsp; call&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; instance string class TestApp.TClass`1::get_X()&lt;BR&gt;IL_001a:&amp;nbsp; stloc.0&lt;BR&gt;IL_001b:&amp;nbsp; br.s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0021&lt;BR&gt;IL_001d:&amp;nbsp; ldnull&lt;BR&gt;IL_001e:&amp;nbsp; stloc.0&lt;BR&gt;IL_001f:&amp;nbsp; br.s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0021&lt;BR&gt;IL_0021:&amp;nbsp; ldloc.0&lt;BR&gt;IL_0022:&amp;nbsp; ret&lt;BR&gt;} // end of method TClass`1::GetProp&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;The question was, why was the stloc.1 and ldloc.1 needed after the ceq instruction at IL_000d (there are actually other issues in this small snippet, but I'll focus on this particular one)&amp;nbsp;. I, too, tried to resolve the issue and batted a few guesses around.&amp;nbsp; I proffered two ideas, and then ultimately suggested that the JIT compiler would likely be modifying this code anyway (particularly once it was recompiled in 'release' with optimization).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Still curious as to why the compiler produced the stloc and ldloc opcodes, I asked around internally until Vance set me straight with this blog post.&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT:0px;"&gt;
&lt;P&gt;&lt;FONT color=blue&gt;&lt;B&gt;Introduction: What does ‘foreach’ actually do?&lt;/B&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;A title=http://blogs.msdn.com/vancem/archive/2006/02/20/535807.aspx href="http://blogs.msdn.com/vancem/archive/2006/02/20/535807.aspx"&gt;&lt;FONT color=#800080&gt;http://blogs.msdn.com/vancem/archive/2006/02/20/535807.aspx&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Essentially, he states what I initially felt -- that the JIT transformations on the IL are so dramatic, that you cannot judge an application's performance based on the IL.&amp;nbsp; He also gives some great information on how to view your JITed code -- with release optimizations and everything.&amp;nbsp; The other side to this is, that after further review, the inefficiencies of the IL were fixed in the optimized IL anyway once the code was set to 'release'.&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Sometimes, it's really easy to get side-tracked by these discussions in your quest for software glory.&amp;nbsp; I'm glad to know we have people like Vance around to set me straight when I do.&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=1307054" width="1" height="1"&gt;</description><category domain="http://blogs.iis.net/tobintitus/archive/tags/Performance/default.aspx">Performance</category><category domain="http://blogs.iis.net/tobintitus/archive/tags/CIL/default.aspx">CIL</category><category domain="http://blogs.iis.net/tobintitus/archive/tags/.NET/default.aspx">.NET</category></item></channel></rss>