<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Silverlight Performance Blog</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/slperf/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/slperf/feed.xml</link>
    <description>Silverlight performance related blog posts provided by the Silverlight perforrmance team members including Mike Cook, Jossef Goldberg and others</description>
    <lastBuildDate>Wed, 17 Apr 2019 03:27:30 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Silverlight Performance @ MIX 11</title>
      <link>https://docs.microsoft.com/archive/blogs/slperf/silverlight-performance-mix-11</link>
      <pubDate>Fri, 15 Apr 2011 21:46:00 GMT</pubDate>
      <dc:creator><![CDATA[Silverlight Performance Team]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/slperf/2011/04/15/silverlight-performance-mix-11/</guid>
      <description><![CDATA[This week in Las Vegas Microsoft hosted MIX 11.&nbsp; This year was a great one to learn about...]]></description>
      <content:encoded><![CDATA[<p>This week in Las Vegas Microsoft hosted MIX 11.&nbsp; This year was a great one to learn about Silverlight Performance at MIX, with three sessions dedicated to the topic!&nbsp; The sessions are now available for on-demand streaming, I've embedded them below for easy viewing.&nbsp; If you like the sessions, please click through and rate them on the MIX page.&nbsp; In the comments section let us know what you liked, what you didn't like, and what other Silverlight Performance related material you'd like to see sessions on in the future.</p>
<p><strong>Silverlight Performance Tips - <a href="https://channel9.msdn.com/events/MIX/MIX11/MED07">https://channel9.msdn.com/events/MIX/MIX11/MED07</a></strong></p>
<p>
<object height="288" type="application/x-silverlight-2" width="512" data="data:application/x-oleobject;base64,QfXq3+HzJEysrJnDBxUISgAJAADqNAAAxB0AAAAAAAAAAAAAAAAAAAAAAABoAAAAaAB0AHQAcAA6AC8ALwBjAGgAYQBuAG4AZQBsADkALgBtAHMAZABuAC4AYwBvAG0ALwBzAGMAcgBpAHAAdABzAC8AQwBoAGEAbgBuAGUAbAA5AC4AeABhAHAAPwB2AD0AMQAuADUAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbgEAAG0AZQBkAGkAYQB1AHIAbAA9AGgAdAB0AHAAOgAvAC8AZgBpAGwAZQBzAC4AYwBoADkALgBtAHMALwBtAGkAeAAvADIAMAAxADEALwB3AG0AdgAvAE0ARQBEADAANwAuAHcAbQB2ACwAdABoAHUAbQBiAG4AYQBpAGwAPQBoAHQAdABwADoALwAvAGYAaQBsAGUAcwAuAGMAaAA5AC4AbQBzAC8AbQBpAHgALwAyADAAMQAxAC8AdABoAHUAbQBiAHMALwBNAEUARAAwADcAXwBsAGcALgBqAHAAZwAsAGQAZQBsAGkAdgBlAHIAeQBtAGUAdABoAG8AZAA9ACwAYQB1AHQAbwBwAGwAYQB5AD0AZgBhAGwAcwBlACwAZQBuAHQAcgB5AGkAZAA9ADcAZAAzADYANwAwADkANQBhAGEAMgBhADQAMwBiADEAOABiAGMAOQA5AGUAYQBmADAAMAA5ADIAZgA2AGIAYwAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAYAAAANAAuADAALgA1ADAANAAwADEALgAwAAAAAAAAAAAAAAAAAAAAAAAAAA==">
<param value="4.0.50401.0" name="minRuntimeVersion" />
<param value="https://channel9.msdn.com/scripts/Channel9.xap?v=1.5" name="source" />
<param value="mediaurl=http://files.ch9.ms/mix/2011/wmv/MED07.wmv,thumbnail=http://files.ch9.ms/mix/2011/thumbs/MED07_lg.jpg,deliverymethod=,autoplay=false,entryid=7d367095aa2a43b18bc99eaf0092f6bc" name="initParams" />
</object>
<p>
<p><strong></strong></p>
<p><strong>Analyzing and Improving Windows Phone Application Performance - <a href="https://channel9.msdn.com/events/MIX/MIX11/DVC01">https://channel9.msdn.com/events/MIX/MIX11/DVC01</a></strong></p>
<object height="288" type="application/x-silverlight-2" width="512" data="data:application/x-oleobject;base64,QfXq3+HzJEysrJnDBxUISgAJAADqNAAAxB0AAAAAAAAAAAAAAAAAAAAAAABoAAAAaAB0AHQAcAA6AC8ALwBjAGgAYQBuAG4AZQBsADkALgBtAHMAZABuAC4AYwBvAG0ALwBzAGMAcgBpAHAAdABzAC8AQwBoAGEAbgBuAGUAbAA5AC4AeABhAHAAPwB2AD0AMQAuADUAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbgEAAG0AZQBkAGkAYQB1AHIAbAA9AGgAdAB0AHAAOgAvAC8AZgBpAGwAZQBzAC4AYwBoADkALgBtAHMALwBtAGkAeAAvADIAMAAxADEALwB3AG0AdgAvAEQAVgBDADAAMQAuAHcAbQB2ACwAdABoAHUAbQBiAG4AYQBpAGwAPQBoAHQAdABwADoALwAvAGYAaQBsAGUAcwAuAGMAaAA5AC4AbQBzAC8AbQBpAHgALwAyADAAMQAxAC8AdABoAHUAbQBiAHMALwBEAFYAQwAwADEAXwBsAGcALgBqAHAAZwAsAGQAZQBsAGkAdgBlAHIAeQBtAGUAdABoAG8AZAA9ACwAYQB1AHQAbwBwAGwAYQB5AD0AZgBhAGwAcwBlACwAZQBuAHQAcgB5AGkAZAA9ADMANAAwADMAMgA1ADYAYgBlAGUAYgAzADQAMQA3ADIAYQA1ADAANQA5AGUAYQA3ADAAMABlAGEANwA3AGUANAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAYAAAANAAuADAALgA1ADAANAAwADEALgAwAAAAAAAAAAAAAAAAAAAAAAAAAA==">
<param value="4.0.50401.0" name="minRuntimeVersion" />
<param value="https://channel9.msdn.com/scripts/Channel9.xap?v=1.5" name="source" />
<param value="mediaurl=http://files.ch9.ms/mix/2011/wmv/DVC01.wmv,thumbnail=http://files.ch9.ms/mix/2011/thumbs/DVC01_lg.jpg,deliverymethod=,autoplay=false,entryid=3403256beeb34172a5059ea700ea77e4" name="initParams" />
</object>
<p><strong></strong></p>
<p><strong>What's New in the Windows Phone Developer Tools - <a href="https://channel9.msdn.com/events/MIX/MIX11/DVC17">https://channel9.msdn.com/events/MIX/MIX11/DVC17</a></strong></p>
<object height="288" type="application/x-silverlight-2" width="512" data="data:application/x-oleobject;base64,QfXq3+HzJEysrJnDBxUISgAJAADqNAAAxB0AAAAAAAAAAAAAAAAAAAAAAABoAAAAaAB0AHQAcAA6AC8ALwBjAGgAYQBuAG4AZQBsADkALgBtAHMAZABuAC4AYwBvAG0ALwBzAGMAcgBpAHAAdABzAC8AQwBoAGEAbgBuAGUAbAA5AC4AeABhAHAAPwB2AD0AMQAuADUAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbgEAAG0AZQBkAGkAYQB1AHIAbAA9AGgAdAB0AHAAOgAvAC8AZgBpAGwAZQBzAC4AYwBoADkALgBtAHMALwBtAGkAeAAvADIAMAAxADEALwB3AG0AdgAvAEQAVgBDADEANwAuAHcAbQB2ACwAdABoAHUAbQBiAG4AYQBpAGwAPQBoAHQAdABwADoALwAvAGYAaQBsAGUAcwAuAGMAaAA5AC4AbQBzAC8AbQBpAHgALwAyADAAMQAxAC8AdABoAHUAbQBiAHMALwBEAFYAQwAxADcAXwBsAGcALgBqAHAAZwAsAGQAZQBsAGkAdgBlAHIAeQBtAGUAdABoAG8AZAA9ACwAYQB1AHQAbwBwAGwAYQB5AD0AZgBhAGwAcwBlACwAZQBuAHQAcgB5AGkAZAA9ADcAZQA0AGYAYQA4ADIAYwBkADIAYgAxADQANQBkADAAOABlADgANwA5AGUAYgA4ADAAMABmADYAZQA1ADQAOAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAYAAAANAAuADAALgA1ADAANAAwADEALgAwAAAAAAAAAAAAAAAAAAAAAAAAAA==">
<param value="4.0.50401.0" name="minRuntimeVersion" />
<param value="https://channel9.msdn.com/scripts/Channel9.xap?v=1.5" name="source" />
<param value="mediaurl=http://files.ch9.ms/mix/2011/wmv/DVC17.wmv,thumbnail=http://files.ch9.ms/mix/2011/thumbs/DVC17_lg.jpg,deliverymethod=,autoplay=false,entryid=7e4fa82cd2b145d08e879eb800f6e548" name="initParams" />
</object>
</p>
<p>Thanks,<br />Mike</p>
</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Components.PostAttachments/00/10/15/47/05/MIX-Silverlight-Performance-Tips.zip" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-10-15-47-05/MIX_2D00_Silverlight_2D00_Performance_2D00_Tips.zip">MIX-Silverlight-Performance-Tips.zip</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Silverlight Runtime Inspector Tools</title>
      <link>https://docs.microsoft.com/archive/blogs/slperf/silverlight-runtime-inspector-tools</link>
      <pubDate>Tue, 01 Mar 2011 15:28:05 GMT</pubDate>
      <dc:creator><![CDATA[Silverlight Performance Team]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/slperf/2011/03/01/silverlight-runtime-inspector-tools/</guid>
      <description><![CDATA[Not sure if folks are aware, but in addition to the Silverlight Spy tool which is a great visual...]]></description>
      <content:encoded><![CDATA[<p>Not sure if folks are aware, but in addition to the <a href="http://firstfloorsoftware.com/">Silverlight Spy</a> tool which is a great visual tool to explore your application runtime tree and detect possible perf bottlenecks, there is also a free tool called <a href="http://aginspector.codeplex.com/">Silverlight Inspector.</a>    <br /><a href="http://aginspector.codeplex.com/">Silverlight Inspector</a> is a <strong>free</strong> utility that lets you view your app visual tree and control/view assemblies within a XAP. This tool is an open source so feel free to download sources and post back your improvements.&#160; </p>  <p>Enjoy. Jossef.</p>]]></content:encoded>
    </item>
    <item>
      <title>Silverlight Performance Best Practices and Resources page posted</title>
      <link>https://docs.microsoft.com/archive/blogs/slperf/silverlight-performance-best-practices-and-resources-page-posted</link>
      <pubDate>Wed, 09 Feb 2011 13:53:07 GMT</pubDate>
      <dc:creator><![CDATA[Silverlight Performance Team]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/slperf/2011/02/09/silverlight-performance-best-practices-and-resources-page-posted/</guid>
      <description><![CDATA[Just wanted folks to know that we added a new pages called Silverlight Performance Best Practices...]]></description>
      <content:encoded><![CDATA[<p>Just wanted folks to know that we added a new pages called <a href="http://blogs.msdn.com/b/slperf/p/resources.aspx">Silverlight Performance Best Practices and Resources</a> where we plan to keep up-to-date with list of perf best practices and resources.</p>  <p>Enjoy. Jossef</p>]]></content:encoded>
    </item>
    <item>
      <title>CLR Profiler for Silverlight 4 is now available</title>
      <link>https://docs.microsoft.com/archive/blogs/slperf/clr-profiler-for-silverlight-4-is-now-available</link>
      <pubDate>Wed, 02 Feb 2011 18:54:18 GMT</pubDate>
      <dc:creator><![CDATA[Silverlight Performance Team]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/slperf/2011/02/02/clr-profiler-for-silverlight-4-is-now-available/</guid>
      <description><![CDATA[David Bronman just posted a new (free) version of the CLR Profiler that supports Silverlight 4 as...]]></description>
      <content:encoded><![CDATA[<p><font size="2">David Bronman just posted a new (free) version of the CLR Profiler that supports Silverlight 4 as well as .NET Framework 4.     <br /></font></p>  <ul></ul>  <p><font size="2">See more details </font><a title="here" href="http://blogs.msdn.com/b/davbr/archive/2011/02/01/clrprofiler-v4-released.aspx" target="_blank"><font size="2">here</font></a><font size="2">.</font></p>]]></content:encoded>
    </item>
    <item>
      <title>Performance on Silverlight TV</title>
      <link>https://docs.microsoft.com/archive/blogs/slperf/performance-on-silverlight-tv</link>
      <pubDate>Mon, 10 Jan 2011 16:25:00 GMT</pubDate>
      <dc:creator><![CDATA[Silverlight Performance Team]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/slperf/2011/01/10/performance-on-silverlight-tv/</guid>
      <description><![CDATA[John Papa recently invited us for an appearance on Silverlight TV to talk about Silverlight...]]></description>
      <content:encoded><![CDATA[<p>John Papa recently invited us for an appearance on Silverlight TV to talk about Silverlight Performance, as embedded here for your viewing pleasure:</p>
<p>
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="512" height="288">
<param name="source" value="https://channel9.msdn.com/scripts/VideoPlayer.xap?v=3.2" />
<param name="initParams" value="deferredLoad=true,duration=0,m=http://files.ch9.ms/ch9/eb2c/8cca920c-c209-4d7b-bc67-9e67015deb2c/sltv57_ch9.wmv,autostart=false,autohide=true,showembed=true, thumbnail=http://files.ch9.ms/ch9/eb2c/8cca920c-c209-4d7b-bc67-9e67015deb2c/sltv57_512_ch9.jpg, postid=0" />
<param name="background" value="#00FFFFFF" />
<a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;">
<img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none" />
</a>
</object>
</p>
<p>See the attached .zip file for slides, scripts, and code samples!</p>
<p>-Mike</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Components.PostAttachments/00/10/11/39/67/Samples.zip" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-10-11-39-67/Samples.zip">Samples.zip</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Silverlight Firestarter Performance Talk</title>
      <link>https://docs.microsoft.com/archive/blogs/slperf/silverlight-firestarter-performance-talk</link>
      <pubDate>Thu, 02 Dec 2010 08:57:00 GMT</pubDate>
      <dc:creator><![CDATA[Silverlight Performance Team]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/slperf/2010/12/02/silverlight-firestarter-performance-talk/</guid>
      <description><![CDATA[The Silverlight Performance Team will be giving a talk at Silverlight Firestarter this afternoon at...]]></description>
      <content:encoded><![CDATA[<p>The Silverlight Performance Team will be giving a talk at Silverlight Firestarter this afternoon at 3:30pm PST on 'Profiling and Performance Tips'.&nbsp; You can tune in at <a href="http://www.silverlight.net">http://www.silverlight.net</a>.</p>
<p>Update: The talk is now available as a standalone video on Channel9 <a target="_blank" href="https://channel9.msdn.com/Series/Silverlight-Firestarter/Silverlight-Firestarter-2010-Session-6-Tune-Your-Application-Profiling-and-Performance-Tips">here</a>.</p>
<p>
<object type="application/x-silverlight-2" height="288" width="512" data="data:application/x-oleobject;base64,QfXq3+HzJEysrJnDBxUISgAJAADqNAAAxB0AABQAAAAjADAAMABGAEYARgBGAEYARgAAAAAAAAAAAAAAAAAAAG4AAABoAHQAdABwADoALwAvAGMAaABhAG4AbgBlAGwAOQAuAG0AcwBkAG4ALgBjAG8AbQAvAHMAYwByAGkAcAB0AHMALwBWAGkAZABlAG8AUABsAGEAeQBlAHIALgB4AGEAcAA/AHYAPQAzAC4AMgAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACeAgAAZABlAGYAZQByAHIAZQBkAEwAbwBhAGQAPQB0AHIAdQBlACwAZAB1AHIAYQB0AGkAbwBuAD0AMAAsAG0APQBoAHQAdABwADoALwAvAGUAYwBuAC4AYwBoAGEAbgBuAGUAbAA5AC4AbQBzAGQAbgAuAGMAbwBtAC8AbwA5AC8AYwBoADkALwA4ADAANQA0AC8AMgA1AGYAMAA3ADgANgA2AC0AMgA2ADEAMAAtADQAOABhAGEALQA4AGIAMwBkAC0AOQBlADMAZgAwADAAMAA2ADgAMAA1ADQALwBTAGkAbAB2AGUAcgBsAGkAZwBoAHQARgBpAHIAZQBzAHQAYQByAHQAZQByAFMAZQBzAHMAaQBvAG4ANgBfAGMAaAA5AC4AdwBtAHYALABhAHUAdABvAHMAdABhAHIAdAA9AGYAYQBsAHMAZQAsAGEAdQB0AG8AaABpAGQAZQA9AHQAcgB1AGUALABzAGgAbwB3AGUAbQBiAGUAZAA9AHQAcgB1AGUALAAgAHQAaAB1AG0AYgBuAGEAaQBsAD0AaAB0AHQAcAA6AC8ALwBlAGMAbgAuAGMAaABhAG4AbgBlAGwAOQAuAG0AcwBkAG4ALgBjAG8AbQAvAG8AOQAvAGMAaAA5AC8AOAAwADUANAAvADIANQBmADAANwA4ADYANgAtADIANgAxADAALQA0ADgAYQBhAC0AOABiADMAZAAtADkAZQAzAGYAMAAwADAANgA4ADAANQA0AC8AUwBpAGwAdgBlAHIAbABpAGcAaAB0AEYAaQByAGUAcwB0AGEAcgB0AGUAcgBTAGUAcwBzAGkAbwBuADYAXwA1ADEAMgBfAGMAaAA5AC4AagBwAGcALAAgAHAAbwBzAHQAaQBkAD0AMAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==">
<param value="https://channel9.msdn.com/scripts/VideoPlayer.xap?v=3.2" name="source" />
<param value="deferredLoad=true,duration=0,m=http://ecn.channel9.msdn.com/o9/ch9/8054/25f07866-2610-48aa-8b3d-9e3f00068054/SilverlightFirestarterSession6_ch9.wmv,autostart=false,autohide=true,showembed=true, thumbnail=http://ecn.channel9.msdn.com/o9/ch9/8054/25f07866-2610-48aa-8b3d-9e3f00068054/SilverlightFirestarterSession6_512_ch9.jpg, postid=0" name="initParams" />
<param value="#00FFFFFF" name="background" />
</object>
</p>
<p>-Mike</p>]]></content:encoded>
    </item>
    <item>
      <title>Silverlight Performance Tip: Understanding the impact of Effects on performance</title>
      <link>https://docs.microsoft.com/archive/blogs/slperf/silverlight-performance-tip-understanding-the-impact-of-effects-on-performance</link>
      <pubDate>Fri, 17 Sep 2010 17:35:00 GMT</pubDate>
      <dc:creator><![CDATA[Silverlight Performance Team]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/slperf/2010/09/17/silverlight-performance-tip-understanding-the-impact-of-effects-on-performance/</guid>
      <description><![CDATA[We recently received a request from a developer to help analyze performance for a basic Silverlight...]]></description>
      <content:encoded><![CDATA[<p><span style="font-family: verdana,geneva;"><span style="font-size: small;">We recently received a request from a developer to help analyze performance for a basic Silverlight application. &nbsp;This particular app was used as one of the </span></span><a href="http://www.silverlight.net/content/samples/sl4/themes/cosmopolitan.html#/Home"><span style="color: #0000ff;"><span style="font-family: verdana,geneva;"><span style="font-size: small;">Silverlight SDK samples</span></span></span></a><span style="font-family: verdana,geneva;"><span style="font-size: small;"> (See image below). The application had a simple set of controls on a form, but its CPU usage was very high. &nbsp;I wanted to share our findings and explain how we fixed the issue.</span></span></p>
<p><span style="font-family: verdana,geneva;"><span style="font-size: small;">The first thing we did was to turn on </span></span><a href="http://msdn.microsoft.com/en-us/library/cc838252(VS.95).aspx"><span style="font-family: verdana,geneva;"><span style="font-size: small;">EnableRedrawRegions</span></span></a><span style="font-family: verdana,geneva;"><span style="font-size: small;">.<span style="mso-spacerun: yes;">&nbsp; </span>This lets you see which rectangles are being redrawn by the graphics engine within your application. Once enabled, all repainted regions&rsquo; colors will change in blue/yellow/pink order.<span style="mso-spacerun: yes;">&nbsp; </span>This can be enabled by passing the parameter shown here in the application .aspx page:</span></span></p>
<p class="MsoNormal"><span style="font-family: verdana,geneva;"><span style="font-size: small;"><span style="color: blue;">&lt;</span><span style="color: maroon;">object</span></span></span><span style="font-family: Consolas; font-size: 9.5pt;"><span style="font-family: verdana,geneva;"><span style="font-size: small;"> <span style="color: red;">data</span><span style="color: blue;">="data:application/x-silverlight-2,"</span> <span style="color: red;">type</span></span></span><span style="font-family: verdana,geneva;"><span style="font-size: small;"><span style="color: blue;">="application/x-silverlight-2"&gt;<br /></span><span style="background-color: #ffff00;"><span style="background-color: #ffff99;">&nbsp;&nbsp;</span><span style="color: blue;"><span style="background-color: #ffff99;">&lt;</span></span><span style="color: maroon;"><span style="background-color: #ffff99;">param</span></span><span style="background-color: #ffff99;"> <span style="color: red;">name</span><span style="color: blue;">="enableRedrawRegions"</span> <span style="color: red;">value</span><span style="color: blue;">="true"/&gt;</span></span></span> <br /><span style="color: blue;">&lt;/</span><span style="color: maroon;">object</span><span style="color: blue;">&gt;</span></span></span></span></p>
<p><strong><span style="color: #1f497d; font-size: 14pt; mso-themecolor: text2; mso-bidi-font-size: 10.0pt;"><span style="font-size: small;"><span style="color: #000000;">The issue:</span></span><br /></span></strong><span style="font-family: Calibri; font-size: small;"><span style="font-family: verdana,geneva;">Once we enabled redraw regions we could see that when we switched to a tab that contained an animation, the entire form was constantly being updated. &nbsp;Looking carefully at the form and also through the template sources we could see that the outer border (as well as one of the inner borders) was using a </span><a href="http://msdn.microsoft.com/en-us/library/system.windows.media.effects.dropshadoweffect(VS.95).aspx"><span style="font-size: 9.5pt;"><span style="font-size: small;"><span style="font-family: verdana,geneva;">DropShadowEffect</span></span></span></a><span style="font-size: small;"><span style="font-family: verdana,geneva;"><span style="color: #a31515;"><span style="color: #000000;"><span style="font-size: small;">.</span></span><span style="font-size: small;"> &nbsp;</span></span><span style="font-size: small;">This means that </span><strong><span style="font-size: small;">any</span></strong><span style="font-size: small;"> redraw of </span><strong><span style="font-size: small;">any child element</span></strong><span style="font-size: small;"> inside of that border&rsquo;s visual tree will trigger a redraw of everything within the effect (in this case, the </span><strong><span style="font-size: small;">entire area of the border</span></strong><span style="font-size: small;">). &nbsp;</span><span style="font-size: small;">So even with a small animation, the entire application was being redrawn every frame! &nbsp;</span><span style="font-size: small;">Note that not only an animation will trigger a redraw, but </span><strong><span style="font-size: small;">any</span></strong><span style="font-size: small;"> redraw such as </span><strong><span style="font-size: small;">cursor blink</span></strong><span style="font-size: small;"> in a text box, or any redraw resulting from mouse movements over a control.<o:p></o:p></span></span></span></span><span style="font-size: small;"><span style="font-family: verdana,geneva;"> </span></span></p>
<p><strong><span style="color: #1f497d;"><span style="font-size: small;"><span style="color: #000000;">The solution:</span></span></span><br /></strong><span style="font-size: small;"><span style="font-family: verdana,geneva;">We could <span style="mso-spacerun: yes;">have </span>simply removed the DropShadowEffect,</span></span><span style="font-family: verdana,geneva;"><span style="font-size: small;">&nbsp;but we wanted to preserve the original design,<span style="mso-spacerun: yes;">&nbsp;so </span>we did the following:<br /></span></span></p>
<ol>
<li><span style="font-size: 12px;"><span style="font-family: verdana,geneva;"><span style="font-size: small;">Add a new sibling element the same size of the border that has the DropShadowEffect,&nbsp;but contains no child elements.</span></span></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;"><span style="font-family: verdana,geneva;"><span style="font-size: small;"></span></span></span><span style="font-family: verdana,geneva;"><span style="font-size: small;">Removed the Effect from the original border.</span></span></li>
</ol>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;"><span style="font-family: verdana,geneva;"><span style="font-size: small;">Below simple changes provided huge performance&nbsp;<span style="color: black; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;">improvements.<br />You are also welcome to dowanload&nbsp;</span></span></span></span></span><span style="font-size: small;"><span style="font-family: Calibri;"><span style="font-family: verdana,geneva;"><span style="font-size: small;"><span style="color: black; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;"><strong>attached</strong> EffectSample.zip code sample.</span></span></span></span></span></p>
<p class="MsoNormal"><strong><span style="font-family: Calibri;"><span style="font-size: small;"><br />Original XAML:</span><br /></span></strong><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">&lt;</span><span style="font-family: Consolas; color: #a31515; font-size: 9pt; mso-bidi-font-size: 9.5pt;">Grid</span><span style="font-family: Consolas; color: red; font-size: 9pt; mso-bidi-font-size: 9.5pt;"> HorizontalAlignment</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">="Center"</span><span style="font-family: Consolas; color: red; font-size: 9pt; mso-bidi-font-size: 9.5pt;"> VerticalAlignment</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">="Center"&gt;<br />&nbsp;&nbsp; &lt;</span><span style="font-family: Consolas; color: #a31515; font-size: 9pt; mso-bidi-font-size: 9.5pt;">Border</span><span style="font-family: Consolas; color: red; font-size: 9pt; mso-bidi-font-size: 9.5pt;"> Background</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">="{</span><span style="font-family: Consolas; color: #a31515; font-size: 9pt; mso-bidi-font-size: 9.5pt;">StaticResource</span><span style="font-family: Consolas; color: red; font-size: 9pt; mso-bidi-font-size: 9.5pt;"> WindowBackgroundBrush</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">}"</span><span style="font-family: Consolas; color: red; font-size: 9pt; mso-bidi-font-size: 9.5pt;"> Effect</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">="{</span><span style="font-family: Consolas; color: #a31515; font-size: 9pt; mso-bidi-font-size: 9.5pt;">StaticResource</span><span style="font-family: Consolas; color: red; font-size: 9pt; mso-bidi-font-size: 9.5pt;"> DropShadowBrush</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">}"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">&lt;</span><span style="font-family: Consolas; color: #a31515; font-size: 9pt; mso-bidi-font-size: 9.5pt;">Grid</span><span style="font-family: Consolas; color: red; font-size: 9pt; mso-bidi-font-size: 9.5pt;"> MinWidth</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">="150"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">&lt;</span><span style="font-family: Consolas; color: #a31515; font-size: 9pt; mso-bidi-font-size: 9.5pt;">ProgressBar</span><span style="font-family: Consolas; color: red; font-size: 9pt; mso-bidi-font-size: 9.5pt;"> Grid.Row</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">="1"</span><span style="font-family: Consolas; color: red; font-size: 9pt; mso-bidi-font-size: 9.5pt;"> IsIndeterminate</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">="True"</span><span style="font-family: Consolas; color: red; font-size: 9pt; mso-bidi-font-size: 9.5pt;"> Height</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">="8"</span><span style="font-family: Consolas; color: red; font-size: 9pt; mso-bidi-font-size: 9.5pt;"> Margin</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">="5"/&gt; </span><span style="font-family: Consolas; color: green; font-size: 9pt; mso-bidi-font-size: 9.5pt;">&lt;!--</span><span style="font-family: Consolas; color: green; font-size: 9pt; mso-bidi-font-size: 9.5pt;"> Animating progress bar<span style="mso-spacerun: yes;">&nbsp; </span>&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">&lt;/</span><span style="font-family: Consolas; color: #a31515; font-size: 9pt; mso-bidi-font-size: 9.5pt;">Grid</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">&gt;<br />&nbsp;&nbsp;</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">&lt;/</span><span style="font-family: Consolas; color: #a31515; font-size: 9pt; mso-bidi-font-size: 9.5pt;">Border</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">&gt;<br /></span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">&lt;/</span><span style="font-family: Consolas; color: #a31515; font-size: 9pt; mso-bidi-font-size: 9.5pt;">Grid</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">&gt;</span></p>
<p class="MsoNormal"><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;"></span><strong><span style="font-family: Calibri;"><span style="font-size: small;"><br />Fixed XAML:</span><br /></span></strong><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">&lt;</span><span style="font-family: Consolas; color: #a31515; font-size: 9pt; mso-bidi-font-size: 9.5pt;">Grid</span><span style="font-family: Consolas; color: red; font-size: 9pt; mso-bidi-font-size: 9.5pt;"> HorizontalAlignment</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">="Center"</span><span style="font-family: Consolas; color: red; font-size: 9pt; mso-bidi-font-size: 9.5pt;"> VerticalAlignment</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">="Center"&gt;<br /></span><span style="font-family: Consolas; color: green; font-size: 9pt; mso-bidi-font-size: 9.5pt;">&nbsp;&nbsp;&lt;!-- Keep this border (which has DropShadowEffect),&nbsp;make sure it has no children --&gt;<br /></span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">&nbsp;&nbsp;&lt;</span><span style="font-family: Consolas; color: #a31515; font-size: 9pt; mso-bidi-font-size: 9.5pt;"><span style="background-color: #ffffff;">Border</span></span><span style="font-family: Consolas; color: red; font-size: 9pt; mso-bidi-font-size: 9.5pt;"> Background</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">="{</span><span style="font-family: Consolas; color: #a31515; font-size: 9pt; mso-bidi-font-size: 9.5pt;">StaticResource</span><span style="font-family: Consolas; color: red; font-size: 9pt; mso-bidi-font-size: 9.5pt;"> WindowBackgroundBrush</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">}"</span><span style="font-family: Consolas; color: red; font-size: 9pt; mso-bidi-font-size: 9.5pt;"> Effect</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">="{</span><span style="font-family: Consolas; color: #a31515; font-size: 9pt; mso-bidi-font-size: 9.5pt;">StaticResource</span><span style="font-family: Consolas; color: red; font-size: 9pt; mso-bidi-font-size: 9.5pt;"> DropShadowBrush</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">}" /&gt;</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;"><br /></span><span style="font-family: Consolas; color: #a31515; font-size: 9pt; mso-bidi-font-size: 9.5pt;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;</span></span><span style="font-family: Consolas; color: green; font-size: 9pt; mso-bidi-font-size: 9.5pt;">&lt;!-- Create a new border sibling border w/o any effects --&gt;<br /></span><span style="font-family: Consolas; color: #a31515; font-size: 9pt; mso-bidi-font-size: 9.5pt;"><span style="mso-spacerun: yes;"><span style="background-color: #ffff99;">&nbsp;&nbsp;</span></span></span><span style="background-color: #ffff99;"><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">&lt;</span><span style="font-family: Consolas; color: #a31515; font-size: 9pt; mso-bidi-font-size: 9.5pt;">Border</span></span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;"><span style="background-color: #ffff99;">&gt;</span><br /><span style="mso-spacerun: yes;">&nbsp;&nbsp; &nbsp;</span>&lt;</span><span style="font-family: Consolas; color: #a31515; font-size: 9pt; mso-bidi-font-size: 9.5pt;">Grid</span><span style="font-family: Consolas; color: red; font-size: 9pt; mso-bidi-font-size: 9.5pt;"> MinWidth</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">="150"&gt;<br /><span style="mso-spacerun: yes;">&nbsp;&nbsp; &nbsp; &nbsp;</span>&hellip;<br /><span style="mso-spacerun: yes;">&nbsp;&nbsp; &nbsp; &nbsp;</span>&lt;</span><span style="font-family: Consolas; color: #a31515; font-size: 9pt; mso-bidi-font-size: 9.5pt;">ProgressBar</span><span style="font-family: Consolas; color: red; font-size: 9pt; mso-bidi-font-size: 9.5pt;"> Grid.Row</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">="1"</span><span style="font-family: Consolas; color: red; font-size: 9pt; mso-bidi-font-size: 9.5pt;"> IsIndeterminate</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">="True"</span><span style="font-family: Consolas; color: red; font-size: 9pt; mso-bidi-font-size: 9.5pt;"> Height</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">="8"</span><span style="font-family: Consolas; color: red; font-size: 9pt; mso-bidi-font-size: 9.5pt;"> Margin</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">="5"/&gt; </span><span style="font-family: Consolas; color: green; font-size: 9pt; mso-bidi-font-size: 9.5pt;">&lt;!--</span><span style="font-family: Consolas; color: green; font-size: 9pt; mso-bidi-font-size: 9.5pt;">Animating progress bar<span style="mso-spacerun: yes;">&nbsp; </span>&gt;<br /><span style="mso-spacerun: yes;">&nbsp;&nbsp; &nbsp;</span></span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">&lt;/</span><span style="font-family: Consolas; color: #a31515; font-size: 9pt; mso-bidi-font-size: 9.5pt;">Grid</span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;">&gt;<br /><span style="mso-spacerun: yes;">&nbsp;&nbsp;</span><span style="background-color: #ffff99;">&lt;/</span></span><span style="font-family: Consolas; color: #a31515; font-size: 9pt; mso-bidi-font-size: 9.5pt;"><span style="background-color: #ffff99;">Border</span></span><span style="font-family: Consolas; color: blue; font-size: 9pt; mso-bidi-font-size: 9.5pt;"><span style="background-color: #ffff99;">&gt;</span><br /></span><span style="font-family: Consolas; color: blue; font-size: 9.5pt;">&lt;/</span><span style="font-family: Consolas; color: #a31515; font-size: 9.5pt;">Grid</span><span style="font-family: Consolas; color: blue; font-size: 9.5pt;">&gt;</span></p>
<p class="MsoNormal"><span style="font-family: Consolas; color: blue; font-size: 9.5pt;"></span></p>
<p>&nbsp;<strong><span style="color: #1f497d; font-size: 14pt; mso-themecolor: text2; mso-bidi-font-size: 10.0pt;"><span style="font-size: small;"><span style="color: #000000;">Summary:</span></span></span></strong></p>
<ol>
<li><span style="font-family: verdana,geneva;"><span style="font-size: small;">Enable </span></span><a href="http://msdn.microsoft.com/en-us/library/cc838252(VS.95).aspx"><span style="font-size: small;"><span style="font-family: verdana,geneva;">RedrawRegion</span></span></a><span style="font-family: verdana,geneva;"><span style="font-size: small;"><span style="font-family: verdana,geneva;"><span style="font-size: small;"> to see what areas of your application are updating.</span></span></span></span></li>
<li><span style="font-family: verdana,geneva;"><span style="font-size: small;"></span></span><span style="font-family: verdana,geneva;"><span style="font-size: small;"><span style="font-family: verdana,geneva;"><span style="font-size: small;">If you must use Effects make sure they are applied to small areas. Otherwise,</span></span></span></span></li>
<li><span style="font-size: small;"></span><span style="font-size: small;"><span style="font-family: verdana,geneva;"><span style="font-size: small;">Make sure that Elements that use effects contain no child elements that could update (e.g. even Textbox with a blinking cursor&nbsp;or mouse hover over a button&nbsp;can impact perf,). Otherwise,</span></span></span></li>
<li><span style="font-size: small;"></span><span style="font-size: small;"><span style="font-family: verdana,geneva;"><span style="font-size: small;">Remove the effect from that element and create new empty sibling element (which has no children) and apply effect on this new element instead.</span></span></span></li>
</ol>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;"></span></span>&nbsp;&nbsp;<img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/39/92/7357.image1.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-39-92/7357.image1.png" border="0" />&nbsp;<img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/39/92/7282.image2.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-39-92/7282.image2.png" border="0" /></p>
<p>&nbsp;<img height="446" width="601" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/39/92/5238.image3.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-39-92/5238.image3.png" border="0" /></p>
<p><span style="font-family: verdana,geneva;"><span style="font-size: small;">Enjoy. Jossef</span></span></p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Components.PostAttachments/00/10/06/43/23/EffectSample.zip" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-10-06-43-23/EffectSample.zip">EffectSample.zip</a></p>]]></content:encoded>
    </item>
    <item>
      <title>What’s new for Performance in Silverlight 4 GDR1</title>
      <link>https://docs.microsoft.com/archive/blogs/slperf/whats-new-for-performance-in-silverlight-4-gdr1</link>
      <pubDate>Thu, 02 Sep 2010 14:09:00 GMT</pubDate>
      <dc:creator><![CDATA[Silverlight Performance Team]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/slperf/2010/09/02/whats-new-for-performance-in-silverlight-4-gdr1/</guid>
      <description><![CDATA[Hopefully folks saw the announcement about Silverlight 4 Service Release GDR1 availability.&nbsp;See...]]></description>
      <content:encoded><![CDATA[<p class="MsoNormal"><span style="mso-themecolor: text2"><span style="font-family: Calibri; font-size: small;"><span style="color: #000000;">Hopefully folks saw the announcement about Silverlight 4 Service Release GDR1 availability.&nbsp;See Tim&rsquo;s link </span></span><a href="http://timheuer.com/blog/archive/2010/09/01/silverlight-service-release-september-2010-gdr1.aspx" title="here"><span style="mso-themecolor: text2"><span style="font-family: Calibri;
                font-size: small;">here</span></span></a><span style="font-family: Calibri; font-size: small;"><span style="color: #000000;"><span style="font-size: small;"> </span>and</span> <a href="http://support.microsoft.com/kb/2164913" title="KB2164913"><span style="color: #000000;"></span></a></span><span style="font-family: Calibri; font-size: small;"><a href="http://support.microsoft.com/kb/2164913" title="KB2164913">KB2164913</a></span><span style="font-size: small;"><span style="font-family: Calibri;"><span style="color: #000000;">.&nbsp; The service release is being distributed by Microsoft Update as an <i style="mso-bidi-font-style: normal">Important</i> update on Vista/Win7 and <i style="mso-bidi-font-style: normal">Critical</i> update on Windows XP/ Windows 2003 Server. Mac and other Windows users who did opt-in for Microsoft Update will be prompted to install Silverlight 4 GDR1 soon after 9/1/2010.</span></span></span></span></p>
<p class="MsoNormal"><span style="color: #000000;">&nbsp;</span></p>
<div><span style="mso-themecolor: text2"><span style="font-size: small;"><span style="font-family: Calibri;"></span></span></span><span style="color: #1f497d;
            mso-themecolor: text2"><span style="font-size: small;"><span style="font-family: Calibri;"><span style="mso-themecolor: text2">
<p class="MsoNormal"><span style="mso-themecolor: text2;"><span style="color: #000000;">In addition to other fixes (See above posts), this release fixes some key performance issues which I wanted to highlight:</span></span></p>
<ol>
<li>
<div class="MsoNormal"><span style="mso-themecolor: text2;"><span style="color: #000000;"></span></span><span style="color: #000000;"><span style="mso-themecolor: text2;">Fixed various memory leaks including:</span></span></div>
<ol>
<li>
<div class="MsoNormal"><span style="color: #000000;"><span style="mso-themecolor: text2;"></span></span><span style="mso-themecolor: text2;"><span style="color: #000000;">Leak when mouse capture is used (ScrollViewer, Button, Slider etc.)<br />e.g. &nbsp;when you use CaptureMouse() for drag and drop scenarios.<br />(See some discussions </span><a href="http://forums.silverlight.net/forums/p/179177/427872.aspx#427872" title="here"><span style="mso-themecolor: text2;">here</span></a><span style="color: #000000;">)&nbsp;&nbsp;</span></span><span style="mso-bidi-font-family: Calibri;
                                                        mso-bidi-theme-font: minor-latin; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin;
                                                        mso-themecolor: text2;"><span style="mso-list: Ignore;"><span style="font: 7pt 'Times New Roman';"><span style="color: #000000;"> </span></span></span></span></div>
</li>
<li>
<div class="MsoNormal"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;
                                            mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-themecolor: text2;"><span style="mso-list: Ignore;"><span style="font: 7pt 'Times New Roman';"><span style="color: #000000;"></span></span></span></span><span style="mso-themecolor: text2;"><span style="color: #000000;">Leak where UserControl cannot be garbage-collected when it contains inline data template.&nbsp;<br /></span></span><span style="mso-themecolor: text2;"><span style="color: #000000;">(See some discussions </span><a href="http://forums.silverlight.net/forums/p/171739/404083.aspx" title="here"><span style="mso-themecolor: text2;">here</span></a><span style="color: #000000;">)</span></span></div>
</li>
<li>
<div class="MsoNormal"><span style="mso-themecolor: text2;"><span style="color: #000000;"></span></span><span style="color: #000000;"><span style="mso-themecolor: text2;">Other memory leaks in some other corner scenarios.</span></span></div>
</li>
</ol></li>
<li>
<div class="MsoNormal"><span style="color: #000000;"><span style="mso-themecolor: text2;">Application cold startup improvement:</span></span></div>
<ol>
<li>
<div class="MsoNormal"><span style="mso-themecolor: text2;"><span style="color: #000000;">Avoid loading of both IL and NGEN&rsquo;d images.</span><span style="mso-spacerun: yes;"><span style="color: #000000;"></span></span></span></div>
</li>
<li>
<div class="MsoNormal"><span style="mso-themecolor: text2;"><span style="mso-spacerun: yes;"><span style="color: #000000;"></span></span></span><span style="color: #000000;"><span style="mso-themecolor: text2;">Allow the Silverlight pre-fetcher (agcp.exe) to run during the Silverlight detection script so that once an application redirects, the Silverlight pages are read from disk.&nbsp; </span><span style="mso-themecolor: text2;">(*The actual startup improvement depends on the application download size and network speed)</span></span><span style="color: #000000;"><span style="mso-bidi-font-family: Calibri;
                                                        mso-bidi-theme-font: minor-latin; mso-fareast-font-family: Calibri; mso-themecolor: text2;
                                                        mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;"></span></span></span></div>
</li>
</ol></li>
<li>
<div class="MsoNormal"><span style="color: #000000;"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;
                                    mso-fareast-font-family: Calibri; mso-themecolor: text2; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;"></span></span><span style="mso-themecolor: text2;">Fixed animation jitter caused by the Silverlight pre-fetcher (agcp.exe) shutting down 10 seconds after a Silverlight application is launched. This was typically seen on a single core machine. <o:p></o:p></span></span></div>
</li>
</ol>
<p class="MsoNormal"><span style="color: #000000;">&nbsp;Enjoy. Jossef.</span></p>
</span></span></span></span></div>]]></content:encoded>
    </item>
    <item>
      <title>Analyzing Silverlight Memory Usage: Part 1 – Obtaining Measurements</title>
      <link>https://docs.microsoft.com/archive/blogs/slperf/analyzing-silverlight-memory-usage-part-1-obtaining-measurements</link>
      <pubDate>Thu, 19 Aug 2010 01:20:00 GMT</pubDate>
      <dc:creator><![CDATA[Silverlight Performance Team]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/slperf/2010/08/19/analyzing-silverlight-memory-usage-part-1-obtaining-measurements/</guid>
      <description><![CDATA[A View from the Top
So you&rsquo;ve decided that it&rsquo;s time to optimize the memory footprint...]]></description>
      <content:encoded><![CDATA[<p class="MsoNormal"><b style="mso-bidi-font-weight: normal;"><span style="font-size: small;"><span style="font-family: Calibri;"><span style="font-size: medium;">A View from the Top<o:p></o:p></span></span></span></b></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">So you&rsquo;ve decided that it&rsquo;s time to optimize the memory footprint of your Silverlight application.<span style="mso-spacerun: yes;">&nbsp; </span>Before you&rsquo;ll be able to do this analysis and optimization, you&rsquo;ll need to understand a little bit about the way that Silverlight is structured.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">Though the Silverlight programming model that you&rsquo;ve come to know and love is accessed via managed code, much of Silverlight&rsquo;s internals are written in native code (C++).<span style="mso-spacerun: yes;">&nbsp; </span>The actions that you take in managed code can cause Silverlight to allocate large amounts of native memory on your behalf, be it for layout, rendering, image allocations, you name it.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">Especially important to remember is that your managed Silverlight elements will have a native memory counterpart.<span style="mso-spacerun: yes;">&nbsp; </span>Reducing the element count in your visual tree will have a direct and favorable impact in native working set.&nbsp; Because of these native allocations, this article will go over analyzing native memory in addition to managed memory.</span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><b style="mso-bidi-font-weight: normal;"><span style="font-size: small;"><span style="font-family: Calibri;"><span style="font-size: medium;">Where to start?<o:p></o:p></span></span></span></b></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">One of the most intimidating parts of performing memory analysis can be deciding where to start.<span style="mso-spacerun: yes;">&nbsp; </span>Often developers don&rsquo;t focus on memory usage until it becomes a problem, at which point the project has already grown to a rather complex scale.<span style="mso-spacerun: yes;">&nbsp; </span>The good news is that there is already a great free tool that can help you divide the problem into more manageable pieces, this tool is VMMap.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">VMMap enables you to look inside your process to see both visual and statistical breakdowns of your working set.<span style="mso-spacerun: yes;">&nbsp; </span>Once you&rsquo;ve attached to your Silverlight application you should see three color-coded horizontal bar charts across the top of the window, where each color corresponds to the similarly colored category row in the grid below.<span style="mso-spacerun: yes;">&nbsp; </span>You can click each of the column headers in the grid to sort the data in that dimension.<span style="mso-spacerun: yes;">&nbsp; </span>Clicking the row for a particular category will filter the per-allocation view at the bottom of the window.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><i style="mso-bidi-font-style: normal;"><span style="font-size: small;"><span style="font-family: Calibri;"><o:p><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/39/92/7571.dd535533_vmmap.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/575x401/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-39-92/7571.dd535533_5F00_vmmap.jpg" border="0" /></o:p></span></span></i></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">Take a moment to familiarize yourself with the terminology displayed in the window.<span style="mso-spacerun: yes;">&nbsp; </span>Even if you think you already understand what each of the categories represents, I recommend you crack open the VMMap help file (via the help menu) and read through the &lsquo;Memory Types&rsquo; and &lsquo;The VMMap Window&rsquo; nodes.<span style="mso-spacerun: yes;">&nbsp; </span>Throughout the rest of this article I&rsquo;ll be using these definitions as a reference.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">Of these terms, &lsquo;Working Set&rsquo; is probably the most inconsistently used term in the entire domain of performance analysis.<span style="mso-spacerun: yes;">&nbsp; </span>Working set is most accurately defined as &ldquo;the amount of committed virtual memory that is in physical memory and owned by the process&rdquo;.<span style="mso-spacerun: yes;">&nbsp; </span>Working set can be broken down into three components; these are the private, shareable, and shared components.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">Shareable memory is memory that <i style="mso-bidi-font-style: normal;">can</i> be shared with other processes, but isn&rsquo;t necessarily.<span style="mso-spacerun: yes;">&nbsp; </span>The most interesting types of shareable memory are generally images (the executable file kind, not the pictographic kind) and mapped files (usually .mui files, or fonts).<span style="mso-spacerun: yes;">&nbsp; </span>If your Silverlight application is the first one to start up on the system, then many of your images and mapped files will be loaded under the &lsquo;Shareable WS&rsquo; column.<span style="mso-spacerun: yes;">&nbsp; </span>If another Silverlight application subsequently starts, these images and mapped files don&rsquo;t need to be reloaded, so much of this memory will move to the &lsquo;Shared WS&rsquo; column as it becomes shared with the other application.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">If memory isn&rsquo;t shareable or shared, it is private.<span style="mso-spacerun: yes;">&nbsp; </span>Private memory is memory that can&rsquo;t be shared with other processes, and is thus private to your application.<span style="mso-spacerun: yes;">&nbsp; </span>Since this is the category that application developers have the most control over and impact on, most of this article will be devoted to investigating and understanding process private memory.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">Now that you have some background on the terminology of memory analysis, let&rsquo;s get back to analyzing your application.<span style="mso-spacerun: yes;">&nbsp; </span>Click on the &lsquo;Private WS&rsquo; column until your private working set is sorted in descending order, now take a look at the largest category.<span style="mso-spacerun: yes;">&nbsp; </span>Chances are you are staring at either &lsquo;Heap&rsquo; or &lsquo;Managed Heap&rsquo;.<span style="mso-spacerun: yes;">&nbsp; </span>Over the next couple sections, I&rsquo;ll go over the tools that are available for analyzing that particular type of memory and how you can use them to your advantage.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><b style="mso-bidi-font-weight: normal;"><span style="font-size: small;"><span style="font-family: Calibri;"><span style="font-size: medium;">Tracking Managed Memory<o:p></o:p></span></span></span></b></p>
<p class="MsoNormal"><span style="font-family: Calibri; font-size: small;">Analyzing managed memory allocations in Silverlight takes a little bit of work as the tools in this space haven&rsquo;t had a chance to mature yet.<span style="mso-spacerun: yes;">&nbsp; </span>At the time of the writing of this article, there are no managed memory profilers available that work with Silverlight.<span style="mso-spacerun: yes;">&nbsp; </span>However, Silverlight 4.0 RTM ships with a copy of the </span><a href="http://msdn.microsoft.com/en-us/library/bb190764.aspx"><span style="font-family: Calibri; font-size: small;">Son of Strike</span></a><span style="font-family: Calibri; font-size: small;"> (SOS) debugging extension for </span><a href="http://www.microsoft.com/whdc/devtools/debugging/default.mspx"><span style="font-family: Calibri; color: #0000ff; font-size: small;">WinDbg</span></a><span style="font-family: Calibri; font-size: small;">.<span style="mso-spacerun: yes;">&nbsp; </span>This will allow you to perform all the SOS actions that you&rsquo;re already familiar with on the desktop in Silverlight.<span style="mso-spacerun: yes;">&nbsp; </span>If you haven&rsquo;t used the SOS debugging extension before, head over to the MSDN &ldquo;</span><a href="http://msdn.microsoft.com/en-us/magazine/cc163528.aspx"><span style="font-family: Calibri; color: #0000ff; font-size: small;">Investigating Memory Issues</span></a><span style="font-size: small;"><span style="font-family: Calibri;">&rdquo; article for a great primer.<span style="mso-spacerun: yes;">&nbsp; </span>Though this article is a bit dated, most of the content is still directly applicable to performing managed memory analysis in Silverlight.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">There are a few tricks you&rsquo;ll need to know in order to attach to your Silverlight application using SOS.<span style="mso-spacerun: yes;">&nbsp; </span>The MSDN article previously mentioned is written in reference to the desktop CLR, so while reading through the document you&rsquo;ll need to make a few changes to get things working properly.<o:p></o:p></span></span></p>
<ol>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-size: small;"><span style="font-family: Calibri;">To load SOS, find the SOS.dll in your Silverlight installation directory.<span style="mso-spacerun: yes;">&nbsp; </span>Here is an example command for loading SOS on my system, you may need to adjust the path accordingly (notice that back slashes are escaped):<br /><span style="font-family: courier new,courier;">.load "C:\\Program Files (x86)\\Microsoft Silverlight\\4.0.50401.0\\sos.dll"</span></span></span></div>
</li>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-family: Calibri;"><span style="font-size: small;">In the section on &lsquo;Measure Managed Heap Size&rsquo;, the article mentions setting a breakpoint in mscorwks.dll, the v2.0 desktop CLR.<span style="mso-spacerun: yes;">&nbsp; </span>For Silverlight 4.0, the assembly you are looking for is &lsquo;coreclr.dll&rsquo;.<span style="mso-spacerun: yes;">&nbsp; </span>Change the breakpoint from the MSDN article to:<br /><span style="font-family: courier new,courier;">bp coreclr!WKS::GCHeap::RestartEE "j (dwo(coreclr!WKS::GCHeap::GcCondemnedGeneration)==2) 'kb';'g'"<o:p></o:p></span></span></span></div>
</li>
</ol>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;">At minimum, there are two SOS commands that you should make sure you are familiar with, these are !DumpHeap and !GCRoot.<span style="mso-spacerun: yes;">&nbsp; </span>Both commands are quite aptly named; DumpHeap shows you a dump of the managed heap, and GCRoot finds roots to a particular object.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;">First let&rsquo;s take a look at the output from DumpHeap.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;"><span style="font-family: courier new,courier;">0:000&gt;<strong> !dumpheap -stat<br /></strong>total 0 objects<br />Statistics:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MT&nbsp;&nbsp;&nbsp; Count&nbsp;&nbsp;&nbsp; TotalSize Class Name<br />&lt;snip/&gt;<br />7b444b64&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 753&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 18072 System.Windows.CoreDependencyProperty<br />79581430&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 777&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 18648 System.RuntimeType[]<br />79584ef4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 497&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29820 System.Reflection.RuntimeMethodInfo<br />7958d7ec&nbsp;&nbsp;&nbsp;&nbsp; 3472&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 55552 System.WeakReference<br />7956f2d0&nbsp;&nbsp;&nbsp;&nbsp; 1755&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 80416 System.Int32[]<br />7b431374&nbsp;&nbsp;&nbsp;&nbsp; 3600&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 86400 MS.Internal.NativeObjectSafeHandle<br />79570100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 104&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 98948 System.Byte[]<br />79571bc0&nbsp;&nbsp;&nbsp;&nbsp; 2282&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 132128 System.Object[]<br />79580758&nbsp;&nbsp;&nbsp;&nbsp; 4196&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 222276 System.String<o:p></o:p></span></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;">By default, DumpHeap sorts by total allocation size in ascending order.<span style="mso-spacerun: yes;">&nbsp; </span>In this sample you can see that the type responsible for allocating the most memory is System.String over 4196 instances.<span style="mso-spacerun: yes;">&nbsp; </span>Looking in the left column you can see the MT value for the System.String type, 79580758.<span style="mso-spacerun: yes;">&nbsp; </span>This can be used to retrieve a listing of all allocations on the GC heap of that type, their address, and their size.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;"><span style="font-family: courier new,courier;">0:000&gt; <strong>!dumpheap -mt 79580758</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;Address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MT&nbsp;&nbsp;&nbsp;&nbsp; Size<br />&lt;snip/&gt;&nbsp;<br />0507f17c 79580758&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 112&nbsp;&nbsp;&nbsp;&nbsp; <br />0507f1ec 79580758&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 128&nbsp;&nbsp;&nbsp;&nbsp; <br />0507f26c 79580758&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24&nbsp;&nbsp;&nbsp;&nbsp; <br />0507f374 79580758&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 40&nbsp;&nbsp;&nbsp;&nbsp; <br />0507f498 79580758&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 36&nbsp;&nbsp;&nbsp;&nbsp; <br /><strong>050800ac 79580758&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 60&nbsp;&nbsp;&nbsp;&nbsp; <br /></strong>05080850 79580758&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 116&nbsp;&nbsp;&nbsp;&nbsp; <br />total 0 objects<br />Statistics:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MT&nbsp;&nbsp;&nbsp; Count&nbsp;&nbsp;&nbsp; TotalSize Class Name<br />79580758&nbsp;&nbsp;&nbsp;&nbsp; 4196&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 222276 System.String<br />Total 4196 objects</span><o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;">Now that you have a list of all instances on the heap, you want to find out <i style="mso-bidi-font-style: normal;">why</i> they are still alive; for this you can use GCRoot.<span style="mso-spacerun: yes;">&nbsp; </span>Simply copy the address (the first column) corresponding to the instance that you&rsquo;re interested in, then run GCroot.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;"><span style="font-family: courier new,courier;">0:000&gt; <strong>!gcroot 050800ac</strong> <br />&lt;snip/&gt;<br />ESP:30f188:Root:&nbsp; 050807f0(System.ServiceModel.Channels.HttpOutput+WebRequestHttpOutput)-&gt;<br />&nbsp; 05080700(System.Net.Browser.BrowserHttpWebRequest)-&gt;<br />&nbsp; 05080760(System.Net.WebHeaderCollection)-&gt;<br />&nbsp; 050808c4(System.Net.NameValueFromDictionary)-&gt;<br />&nbsp; 05080948(System.Collections.Generic.Dictionary`2+Entry[[System.String, mscorlib],[System.Collections.Generic.List`1[[System.String, mscorlib]], mscorlib]][])-&gt;<br />&nbsp; 05080a64(System.Collections.Generic.List`1[[System.String, mscorlib]])-&gt;<br />&nbsp; 05080a7c(System.Object[])-&gt;<br />&nbsp; 050800ac(System.String)<br />Scan Thread 1 OSTHread 2d28<br />Scan Thread 5 OSTHread 2f34<br />Scan Thread 19 OSTHread 1f6c<br />Scan Thread 21 OSTHread 2cb0<br />DOMAIN(048AAFE8):HANDLE(Strong):a9117c:Root:&nbsp; 0508083c(System.Threading._TimerCallback)-&gt;<br />&nbsp; 05080664(System.ServiceModel.Channels.HttpChannelFactory+HttpRequestChannel+HttpChannelAsyncRequest)-&gt;<br />&nbsp; 05080700(System.Net.Browser.BrowserHttpWebRequest)-&gt;<br />&nbsp; 05080760(System.Net.WebHeaderCollection)-&gt;<br />&nbsp; 050808c4(System.Net.NameValueFromDictionary)-&gt;<br />&nbsp; 05080948(System.Collections.Generic.Dictionary`2+Entry[[System.String, mscorlib],[System.Collections.Generic.List`1[[System.String, mscorlib]], mscorlib]][])-&gt;<br />&nbsp; 05080a64(System.Collections.Generic.List`1[[System.String, mscorlib]])-&gt;<br />&nbsp; 05080a7c(System.Object[])-&gt;<br />&nbsp; 050800ac(System.String)<o:p></o:p></span></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;">Sometimes just having GC root stack information won&rsquo;t be enough information for you to understand what&rsquo;s going on.<span style="mso-spacerun: yes;">&nbsp; </span>In these cases it can help to inspect the managed object&rsquo;s actual fields, this can be achieved using the DO command.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;"><span style="font-family: courier new,courier;">0:000&gt; <strong>!do 050800ac</strong> <br />Name:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.String<br />MethodTable: 79580758<br />EEClass:&nbsp;&nbsp;&nbsp;&nbsp; 7916205c<br />Size:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 60(0x3c) bytes<br />File:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C:\Program Files (x86)\Microsoft Silverlight\4.0.50401.0\mscorlib.dll<br /><strong>String:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text/xml; charset=utf-8</strong><br />Fields:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MT&nbsp;&nbsp;&nbsp; Field&nbsp;&nbsp; Offset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Type VT&nbsp;&nbsp;&nbsp;&nbsp; Attr&nbsp;&nbsp;&nbsp; Value Name<br />79580e94&nbsp; 40000f1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Int32&nbsp; 1 instance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 23 m_stringLength<br />795819c4&nbsp; 40000f2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Char&nbsp; 1 instance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 74 m_firstChar<br />79580758&nbsp; 40000f3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.String&nbsp; 0&nbsp;&nbsp; shared&nbsp;&nbsp; static Empty<br />795807e4&nbsp; 40000f4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4e0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Boolean&nbsp; 1&nbsp;&nbsp; shared&nbsp;&nbsp; static _legacyConfigChecked<br />795807e4&nbsp; 40000f5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4e4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Boolean&nbsp; 1&nbsp;&nbsp; shared&nbsp;&nbsp; static _legacyMode</span></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;">In this case you can see that the value of the string was <b style="mso-bidi-font-weight: normal;">text/xml; charset=utf-8</b>.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;">Given managed heap dumps, GC root stacks, and the ability to inspect individual objects you should have everything that you need to start trimming your managed memory usage.<span style="mso-spacerun: yes;">&nbsp; </span>There are plenty of good articles on the web on using the SOS extension in conjunction with WinDbg to optimize your managed memory usage, so I won&rsquo;t go into more detail here.<span style="mso-spacerun: yes;">&nbsp; </span>Instead, in subsequent posts, I&rsquo;ll focus on Silverlight specific techniques, or scenarios commonly run into while building Silverlight applications.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><b style="mso-bidi-font-weight: normal;"><span style="font-family: Calibri;"><span style="font-size: small;">Future Managed Memory Tools<o:p></o:p></span></span></b></p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;">In Silverlight 4.0 we added the ability to use the CLR v4.0 profiling API in Silverlight. <span style="mso-spacerun: yes;">&nbsp;&nbsp;</span>Because of this, third-parties now have the opportunity to write managed memory profilers (or adapt existing ones) to work with Silverlight.<span style="mso-spacerun: yes;">&nbsp; </span>As mentioned at the beginning of this section, at the time of writing of this article no profilers are available, but as time goes on I expect we&rsquo;ll see more and more managed memory profiling tools for Silverlight.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><b style="mso-bidi-font-weight: normal;"><span style="font-family: Calibri;"><span style="font-size: medium;">Tracking Native Memory<o:p></o:p></span></span></b></p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;">As I mentioned earlier, much of Silverlight&rsquo;s internals are written in native code.<span style="mso-spacerun: yes;">&nbsp; </span>The actions that you take at the application layer in managed code will cause Silverlight to make native allocations on your behalf for a variety of reasons.<span style="mso-spacerun: yes;">&nbsp; </span>Because of this, you should know how to inspect these allocations should an issue arise.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: Calibri; font-size: small;">Before we get started, take a look at a VMMap snapshot of your application.<span style="mso-spacerun: yes;">&nbsp; </span>Focus on the &lsquo;Heap&rsquo; and &lsquo;Private Data&rsquo; sections of the snapshot as these will determine where you are seeing a larger amount of allocations.<span style="mso-spacerun: yes;">&nbsp; </span>In either case we will use XPerf from the </span><a href="http://msdn.microsoft.com/en-us/performance/cc825801.aspx"><span style="font-family: Calibri; font-size: small;">Windows Performance Toolkit</span></a><span style="font-family: Calibri;"><span style="font-size: small;"> for tracking allocations, though the method will be slightly different should you choose to investigate heap or private data.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><b style="mso-bidi-font-weight: normal;"><span style="font-family: Calibri;"><span style="font-size: small;">Native Heap Analysis<o:p></o:p></span></span></b></p>
<p class="MsoNormal"><span style="font-family: Calibri; font-size: small;">So VMMap is reporting that you are holding large amounts of memory on the native heap.<span style="mso-spacerun: yes;">&nbsp; </span>The first step in correcting this problem is to collect a heap trace and use the XPerf heap plugin to dissect it.<span style="mso-spacerun: yes;">&nbsp; </span>Collecting a heap trace is a little tricky but I&rsquo;ve written a handy script to ease the process, you can get it here [<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/39/92/6786.HeapMonitor.zip" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-39-92/6786.HeapMonitor.zip">Download HeapMonitor.zip</a>].<span style="mso-spacerun: yes;">&nbsp; </span>If you&rsquo;d prefer to control XPerf directly, or if you&rsquo;d just like more background information, see the &ldquo;</span><a href="http://msdn.microsoft.com/en-us/library/ff190906(VS.85).aspx"><span style="font-family: Calibri; color: #0000ff; font-size: small;">Exploring Process Heaps Using WPA</span></a><span style="font-family: Calibri;"><span style="font-size: small;">&rdquo; article on MSDN.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;"><strong>Attaching to Silverlight<o:p></o:p></strong></span></span></p>
<ol>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-size: small;"><span style="font-family: Calibri;">Attaching to an in-browser Silverlight application:</span></span><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri; font-size: small;"></span></span></span></div>
<ol>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-family: Calibri; font-size: small;"></span></span></span><span style="font-size: small;"><span style="font-family: Calibri;">Launch Internet Explorer with your homepage set to &ldquo;about:blank&rdquo;.</span></span></div>
</li>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-size: small;"><span style="font-family: Calibri;"></span></span><span style="font-size: small;"><span style="font-family: Calibri;">Open an administrative command prompt with XPerf in your path and run:<br /><strong><span style="font-family: courier new,courier;">HeapMonitor.cmd &ndash;p &lt;process-id-of-internet-explorer&gt;</span></strong></span></span></div>
</li>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-size: small;"><span style="font-family: Calibri;"></span></span><span style="font-family: Calibri;"><span style="font-size: small;">Wait for the trace sessions to start, when its ready you should see the text, &ldquo;Hit enter to stop profiling...&rdquo;</span></span></div>
</li>
</ol></li>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-size: small;"><span style="font-family: Calibri;">Attaching to an out-of-browser Silverlight application. </span></span></div>
<ol>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-size: small;"><span style="font-family: Calibri;">Install your Silverlight out-of-browser application on the system and run it.</span></span></div>
</li>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-size: small;"><span style="font-family: Calibri;"></span></span><span style="font-size: small;"><span style="font-family: Calibri;">Run &lsquo;Process Explorer&rsquo; and find the copy of sllauncher.exe associated with your app (you can use &lsquo;right-click =&gt; Window =&gt; Bring to front&rsquo; to help discover which sllauncher.exe process is for your app).</span></span></div>
</li>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-size: small;"><span style="font-family: Calibri;"></span></span><span style="font-size: small;"><span style="font-family: Calibri;">Right click on that copy of sllauncher.exe and click &lsquo;Properties&rsquo;, then remember the OOB token that shows up under &ldquo;Command line&rdquo;,<span style="mso-spacerun: yes;">&nbsp; </span>this token is shown in bold below:<br /><span style="font-family: courier new,courier;">"C:\Program Files (x86)\Microsoft Silverlight\sllauncher.exe" <b style="mso-bidi-font-weight: normal;">3800347859.testapp</b></span></span></span></div>
</li>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-size: small;"><span style="font-family: Calibri;">Open WinDbg and re-launch sllauncher.exe using &ldquo;File =&gt; Open Executable&hellip;&rdquo; passing your OOB token and the /debug flag as command line arguments:<br />File name: <span style="font-family: courier new,courier;">"C:\Program Files (x86)\Microsoft Silverlight\sllauncher.exe"</span><br />Arguments: <span style="font-family: courier new,courier;">&ldquo;3800347859.testapp /debug&rdquo;</span></span></span></div>
</li>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-size: small;"><span style="font-family: Calibri;">Open an administrative command prompt with XPerf in your path and run:<br /><strong><span style="font-family: courier new,courier;">HeapMonitor.cmd &ndash;p &lt;process-id-of-sllauncher&gt;</span></strong></span></span></div>
</li>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-size: small;"><span style="font-family: Calibri;"></span></span><span style="font-size: small;"><span style="font-family: Calibri;">Wait for the trace sessions to start, when its ready you should see the text, &ldquo;Hit enter to stop profiling&hellip;&rdquo;</span></span></div>
</li>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-size: small;"><span style="font-family: Calibri;"></span></span><span style="font-family: Calibri;"><span style="font-size: small;">In the WinDbg command window run the &ldquo;g&rdquo; command to allow the process to run.<o:p></o:p></span></span></div>
</li>
</ol></li>
</ol>
<p>&nbsp;</p>
<p class="MsoNormal"><b style="mso-bidi-font-weight: normal;"><span style="font-family: Calibri;"><span style="font-size: small;">Run Your Scenario<o:p></o:p></span></span></b></p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;">Now that heap tracing is on, use your application as you normally would.<span style="mso-spacerun: yes;">&nbsp; </span>Perform any actions that are known to cause the native heap to grow to large sizes in your application so that we can look over them in the trace.<span style="mso-spacerun: yes;">&nbsp; </span>Once you are finished reproducing your scenario press enter in the command prompt where you are running the heap trace.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;">It will take a moment for the trace sessions to be shut down and merged; this can take a long time so you&rsquo;ll need to be patient.<span style="mso-spacerun: yes;">&nbsp; </span>When your trace is ready you&rsquo;ll see the word &ldquo;Finished&rdquo; printed in the command prompt.<span style="mso-spacerun: yes;">&nbsp; </span>The line above should tell you the name of your output trace file.</span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;"><strong>Analyzing Your Heap Trace<o:p></o:p></strong></span></span></p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;">Open the output ETL file using XPerf and you&rsquo;ll see a series of horizontal charts.<span style="mso-spacerun: yes;">&nbsp; </span>You can refer back to the XPerf documentation for the details on what each graph displays, this article will only talk about the &lsquo;Heap Outstanding Allocation Size&rsquo; graph as shown here.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;"><o:p><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/39/92/2437.HeapOutstandingAllocationSizeGraph.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/575x210/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-39-92/2437.HeapOutstandingAllocationSizeGraph.png" border="0" /></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;">The graph shows the number outstanding bytes allocated over time.<span style="mso-spacerun: yes;">&nbsp; </span>You can use the mouse to select a region of the graph, and right click to zoom in or perform other operations.<span style="mso-spacerun: yes;">&nbsp; </span>You can use this to select an interesting area of the graph such as a spike in allocation, then right click and select &lsquo;Summary Table&rsquo; to get a textual breakdown of heap allocations.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;"><strong>Resolving Symbols<o:p></o:p></strong></span></span></p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;">In order to make any of this information useful you&rsquo;ll need to make sure you&rsquo;re properly set up to resolve symbols.<span style="mso-spacerun: yes;">&nbsp; </span>In XPerf click &ldquo;Trace =&gt; Configure Symbol Paths&rdquo; and set the following values, adjusting your symbol cache accordingly.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;"><o:p><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/39/92/6685.ConfigurePublicSymbols.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/524x324/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-39-92/6685.ConfigurePublicSymbols.png" border="0" /></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;">Next, in order to make the most use of XPerf, you&rsquo;ll want to configure your view in the following way.<span style="mso-spacerun: yes;">&nbsp; </span>Arrange your columns from left to right in the same order as shown below, taking care to put the yellow divider in the right location.<span style="mso-spacerun: yes;">&nbsp; </span>Columns to the left of the yellow divider are intelligently grouped; columns to the right are not.<span style="mso-spacerun: yes;">&nbsp; </span>This configuration is just to get you started, feel free to customize your view once you get more familiar with the tool.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;"><o:p><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/39/92/6758.XperfColumns.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/520x88/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-39-92/6758.XperfColumns.png" border="0" /></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;">Once you&rsquo;ve set up your columns, from left to right you have the following:<o:p></o:p></span></span></p>
<ol>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-size: small;"><span style="font-family: Calibri;">Allocation Type.<span style="mso-spacerun: yes;">&nbsp; </span>This will be one of the four values below.<span style="mso-spacerun: yes;">&nbsp; </span>These categories are relative to your selection on the allocation graph.</span></span></div>
<ol>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-size: small;"><span style="font-family: Calibri;">AIFI &ndash; (A)llocated (I)nside (F)reed (I)nside</span></span></div>
</li>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-family: Calibri;"><span style="font-size: small;">AIFO &ndash; (A)llocated (I)nside (F)reed (O)utside</span></span></div>
<ol>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-size: small;"><span style="font-family: Calibri;">Likely the most interesting category, these allocations were created but never freed inside your selection.<span style="mso-spacerun: yes;">&nbsp; </span>These have essentially &ldquo;leaked&rdquo; from your selection, even though they may be freed later down the line.</span></span></div>
</li>
</ol></li>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-size: small;"><span style="font-family: Calibri;">AOFI &ndash; (A)llocated (O)utside (F)reed (I)nside</span></span></div>
</li>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-family: Calibri;"><span style="font-size: small;">AOFO &ndash; (A)llocated (O)utside (F)reed (O)utside</span></span></div>
</li>
</ol></li>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-family: Calibri;"><span style="font-size: small;">HeapHandle &ndash; The address of a particular heap.</span></span></div>
</li>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-family: Calibri;"><span style="font-size: small;">Stack &ndash; The call stack at which the allocation happened.<span style="mso-spacerun: yes;">&nbsp; </span>This hierarchical and can be expanded to drill down to a more specific set of allocations.</span></span><span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font-size: small;"></span></span></span></div>
</li>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font-size: small;"></span></span></span><span style="font-family: Calibri;"><span style="font-size: small;">Count &ndash; The number of inclusive heap allocations for a particular type, heap handle, and call stack.</span></span><span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font-size: small;"></span></span></span></div>
</li>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font-size: small;"></span></span></span><span style="font-size: small;"><span style="font-family: Calibri;">Size &ndash; The inclusive size of all allocations in bytes for a particular type, heap handle, and call stack.<o:p></o:p></span></span></div>
</li>
</ol>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">Now let&rsquo;s take a look at an example of a potentially problematic call stack.<span style="mso-spacerun: yes;">&nbsp; </span>Here is a seemingly innocuous looking piece of XAML that loads an image from Bing and displays it as a thumbnail at 150x80.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p><span style="font-size: small;"></span><span style="font-size: small;"><span style="font-family: Calibri;"><span style="font-family: Consolas; color: #0000ff; font-size: x-small;"><span style="font-family: Consolas; color: #0000ff; font-size: x-small;"><span style="font-family: Consolas; color: #0000ff; font-size: x-small;"><span style="font-family: Consolas; color: #0000ff; font-size: x-small;"><span style="font-family: Consolas; color: #0000ff; font-size: x-small;"><span style="font-family: Consolas; color: #0000ff; font-size: x-small;"></span></span></span></span></span></span><span style="font-size: small;"><span style="font-family: Consolas; color: #a31515;"><span style="font-family: Consolas; color: #a31515;"><span style="font-family: Consolas; color: #a31515;"><span style="color: #0000ff;">&lt;</span>Image</span></span></span><span style="font-family: Consolas; color: #ff0000;"><span style="font-family: Consolas; color: #ff0000;"><span style="font-family: Consolas; color: #ff0000;"> Source</span></span></span><span style="font-family: Consolas; color: #0000ff;"><span style="font-family: Consolas; color: #0000ff;"><span style="font-family: Consolas; color: #0000ff;">="http://www.bing.com/fd/hpk2/Avignon_EN-US2139801834.jpg"</span></span></span><span style="font-family: Consolas; color: #ff0000;"><span style="font-family: Consolas; color: #ff0000;"><span style="font-family: Consolas; color: #ff0000;"> Width</span></span></span><span style="font-family: Consolas; color: #0000ff;"><span style="font-family: Consolas; color: #0000ff;"><span style="font-family: Consolas; color: #0000ff;">="150"</span></span></span><span style="font-family: Consolas; color: #ff0000;"><span style="font-family: Consolas; color: #ff0000;"><span style="font-family: Consolas; color: #ff0000;"> Height</span></span></span><span style="font-family: Consolas; color: #0000ff;"><span style="font-family: Consolas; color: #0000ff;"><span style="font-family: Consolas; color: #0000ff;">="80" /&gt;</span></span></span></span></span></span>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">Doing the math, we&rsquo;d expect that this image would take 150x80 x 4 bytes per pixel, or 48kb of memory, no big deal right?<span style="mso-spacerun: yes;">&nbsp; </span>Wrong unfortunately.<span style="mso-spacerun: yes;">&nbsp; </span>As of Silverlight 4.0 there is no way to set the size at which an image is <i style="mso-bidi-font-style: normal;">decoded</i>, they&rsquo;re always decoded at full size.<span style="mso-spacerun: yes;">&nbsp; </span>The actual resolution of the image at that URL was a much larger 956x512, weighing in at 1,961,984 bytes not counting headers.<span style="mso-spacerun: yes;">&nbsp; </span>This can be seen in the call stack below: <o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;"><o:p><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/39/92/0652.ImageAllocationStack.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/575x300/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-39-92/0652.ImageAllocationStack.png" border="0" /></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: Calibri; font-size: small;">Not all native allocations are this obvious to track back to their design-time source, but oversized image allocations are a common problem we see in customer applications so this is a particularly useful example.<span style="mso-spacerun: yes;">&nbsp; </span>To fix this issue, ideally you would explicitly define the DecodePixelWidth/Height for the image; as Silverlight doesn&rsquo;t support this yet you&rsquo;ll need to employ a workaround such as </span><a href="http://www.wintellect.com/CS/blogs/jprosise/archive/2009/12/17/silverlight-s-big-image-problem-and-what-you-can-do-about-it.aspx"><span style="font-family: Calibri; font-size: small;">this</span></a><span style="font-size: small;"><span style="font-family: Calibri;">.</span></span></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;"></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;"><strong><span style="font-size: medium;">Conclusion</span></strong></span></span></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">Hopefully this article has supplied you with some new and useful information when it comes to gathering data about your Silverlight application's memory usage.&nbsp; These tools and techniques, coupled with your domain knowledge about your application, should prove to be quite a powerful combination for locating suspicious allocations in your application.&nbsp; In subsequent posts on analyzing Silverlight memory usage we will cover some more specific scenarios that build on the foundation techniques in this article.</span></span></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;"></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">-Mike Cook</span></span></p>
</p>]]></content:encoded>
    </item>
    <item>
      <title>Silverlight Startup Best Practices</title>
      <link>https://docs.microsoft.com/archive/blogs/slperf/silverlight-startup-best-practices</link>
      <pubDate>Fri, 13 Aug 2010 17:55:00 GMT</pubDate>
      <dc:creator><![CDATA[Silverlight Performance Team]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/slperf/2010/08/13/silverlight-startup-best-practices/</guid>
      <description><![CDATA[Introduction
Startup is important because it is the first interaction that your user has with your...]]></description>
      <content:encoded><![CDATA[<p class="MsoNormal"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%; font-size: 12pt; mso-bidi-font-size: 11.0pt;"><span style="font-family: Calibri;">Introduction<o:p></o:p></span></span></b></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">Startup is important because it is the first interaction that your user has with your application.<span style="mso-spacerun: yes;">&nbsp; </span>You get one chance to impress, and failure to do so could mean the user closing and/or uninstalling your application permanently.<span style="mso-spacerun: yes;">&nbsp; </span>What follows is a set of tips and tricks you can use to supercharge the startup path of your Silverlight application.</span></span></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;"></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%; font-size: 12pt; mso-bidi-font-size: 11.0pt;"><span style="font-family: Calibri;">The Cardinal Rule<o:p></o:p></span></span></b></p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;">There is, essentially, a single cardinal rule.<o:p></o:p></span></span></p>
<p class="MsoNormal"><i style="mso-bidi-font-style: normal;"><span style="font-family: Calibri;"><span style="font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do the absolute minimum required to display your main screen.<o:p></o:p></span></span></i></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;">Write this on a sticky note and hang it on your monitor.<span style="mso-spacerun: yes;">&nbsp; </span>This may seem like common sense (I like to think so), but I&rsquo;ve analyzed many an application that violates this rule in more ways than one.<span style="mso-spacerun: yes;">&nbsp; </span>The less deterministic the code is that you&rsquo;re executing, the more you&rsquo;re asking for trouble.<span style="mso-spacerun: yes;">&nbsp; </span>To subdivide this rule into some specific examples:<o:p></o:p></span></span></p>
<ul>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-family: Calibri;"><span style="font-size: small;">Minimize your download size.</span></span></div>
</li>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-family: Calibri;"><span style="font-size: small;"></span></span><span style="font-family: Calibri;"><span style="font-size: small;">Never wait on network I/O before displaying your main screen.</span></span></div>
</li>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-family: Calibri;"><span style="font-size: small;"></span></span><span style="font-size: small;"><span style="font-family: Calibri;">Minimize disk I/O, delay-load any data or business logic that you can.<o:p></o:p></span></span></div>
</li>
</ul>
<p>&nbsp;</p>
<p class="MsoNormal"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%; font-size: 12pt; mso-bidi-font-size: 11.0pt;"><span style="font-family: Calibri;">Minimize your download size<o:p></o:p></span></span></b></p>
<p class="MsoNormal"><span style="font-family: Calibri; font-size: small;">Since your application has to be downloaded before it can start up, your download size directly affects startup time.<span style="mso-spacerun: yes;">&nbsp; </span>Consider dividing your application into multiple XAP files.<span style="mso-spacerun: yes;">&nbsp; </span>The first XAP should include only what is necessary to display your main screen and provide core functionality.<span style="mso-spacerun: yes;">&nbsp; </span>Tim Heuer has put together a great video on silverlight.net titled &ldquo;</span><a href="http://www.silverlight.net/learn/videos/silverlight-videos/loading-dynamic-xaps-and-assemblies/"><span style="font-family: Calibri; font-size: small;">Loading Dynamic XAPs and Assemblies</span></a><span style="font-size: small;"><span style="font-family: Calibri;">&rdquo; that explains this concept in detail.<span style="mso-spacerun: yes;">&nbsp; </span>Use this method to componentize and delay load parts of your application that pull in large dependencies and/or don&rsquo;t absolutely <i style="mso-bidi-font-style: normal;">need</i> to be available when your application starts up.<o:p></o:p></span></span></p>
<p><span style="line-height: 25%;">&nbsp;</span></p>
<p class="MsoNormal"><span style="font-family: Calibri; font-size: small;">Another great tip on Silverlight XAP compression comes from David Anson.<span style="mso-spacerun: yes;">&nbsp; </span>A Silverlight XAP is just a renamed Zip file, but as of Silverlight 4 our XAP compression algorithm isn&rsquo;t as efficient as it could be.<span style="mso-spacerun: yes;">&nbsp; </span>By simply re-zipping your XAP files using an optimal compression algorithm you can shave about 20% off your download size (as high as 70% in extreme cases).<span style="mso-spacerun: yes;">&nbsp; </span>Check out David&rsquo;s post, &ldquo;</span><a href="http://blogs.msdn.com/b/delay/archive/2008/07/16/smaller-is-better-a-simple-step-to-shrink-the-download-size-of-silverlight-2-applications.aspx"><span style="font-family: Calibri; color: #0000ff; font-size: small;">Smaller is better!</span></a><span style="font-size: small;"><span style="font-family: Calibri;">&rdquo; for the details and a useful script to help you automate the process.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%; font-size: 12pt; mso-bidi-font-size: 11.0pt;"><span style="font-family: Calibri;">Never wait on network I/O<o:p></o:p></span></span></b></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">No-doubt, this is one of the riskiest things you can do during startup.<span style="mso-spacerun: yes;">&nbsp; </span>Network I/O latency is non-deterministic; when you make a call to a web service or access data from a network share your request could return in 2 milliseconds, 2 seconds, 2 minutes, or it may never return at all!<span style="mso-spacerun: yes;">&nbsp; </span>If your application waits for this data to be retrieved before showing your UI, it may <i style="mso-bidi-font-style: normal;">never</i> show up.<span style="mso-spacerun: yes;">&nbsp; </span>At best, you are gambling on the speed of your network connection to determine your startup time.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%; font-size: 12pt; mso-bidi-font-size: 11.0pt;"><span style="font-family: Calibri;">Minimize disk I/O<o:p></o:p></span></span></b></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">When you increase the amount of data that you load from disk (whether raw data files or loading unnecessary assemblies) you increase the amount of time that you&rsquo;re waiting for physical media.<span style="mso-spacerun: yes;">&nbsp; </span>It takes a substantial amount of time for your hard disk to seek to each new read location, and it takes time to read the data once you seek there.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;"><b style="mso-bidi-font-weight: normal;">Load Fewer Assemblies at Startup</b><br />One way to minimize disk I/O is to reduce the number of assemblies that your application loads.<span style="mso-spacerun: yes;">&nbsp; </span>In Silverlight, a new assembly is loaded the first time that the CLR just-in-time (JIT) compiles a method that accesses a type from it.<span style="mso-spacerun: yes;">&nbsp; </span>For example, if you took a simple &ldquo;Hello World&rdquo; Silverlight application and added a DataGrid to it, this would cause System.Windows.Controls.Data.dll (where DataGrid lives) to be loaded.<span style="mso-spacerun: yes;">&nbsp; </span>You can use the </span></span><a href="http://technet.microsoft.com/en-us/sysinternals/dd535533.aspx"><span style="font-family: Calibri; color: #0000ff; font-size: small;">VMMap</span></a><span style="font-size: small;"><span style="font-family: Calibri;"> tool from Windows Sysinternals to discover which assemblies you are loading, and how much data from each one.<span style="mso-spacerun: yes;">&nbsp; </span>Assemblies can be found under the &lsquo;Images&rsquo; category as seen in the screenshot below:<o:p></o:p></span></span></p>
<p class="MsoNormal"><o:p><span style="font-family: Calibri; font-size: small;">&nbsp;<img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/39/92/0820.Figore01_pub.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/575x175/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-39-92/0820.Figore01_5F00_pub.png" border="0" /></span></o:p></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">Since an assembly isn&rsquo;t loaded until you pull in one of its types, there are two scenarios to keep in mind:<o:p></o:p></span></span></p>
<ol>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-family: Calibri; font-size: small;">Static members can cause dependencies to be loaded eagerly.<span style="mso-spacerun: yes;">&nbsp; </span>For example, if you have a static field of type DataGrid, System.Windows.Controls.Data.dll will be loaded at application startup during static initialization.<span style="mso-spacerun: yes;">&nbsp; </span>This can be avoided by leveraging System.Lazy&lt;T&gt;, see the MSDN documentation for details.<span style="mso-spacerun: yes;">&nbsp; </span>More information on lazy initialization can be found </span><a href="http://msdn.microsoft.com/en-us/library/dd997286(VS.95).aspx"><span style="font-family: Calibri; color: #0000ff; font-size: small;">here</span></a><span style="font-size: small;"><span style="font-family: Calibri;">.</span></span></div>
</li>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-size: small;"><span style="font-family: Calibri;">A method that conditionally loads a new dependency can be refactored so that the assembly is loaded when it&rsquo;s actually needed.<br /><span style="font-family: courier new,courier;"><span style="font-size: x-small;"><span style="font-size: small;"><span style="color: #0000ff;">private void</span> OnLoaded(<span style="color: #0000ff;">object</span> sender, <span style="color: #2b91af;">RoutedEventArgs</span> e)<br />{<br />&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">bool</span> b = <span style="color: #0000ff;">true</span>;<br />&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">if</span> (b == <span style="color: #0000ff;">true</span>)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: small;"><span style="color: #008000;">// Instead of this, refactor into a method, this will<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;prevent System.Windows.Controls.Data.dll where<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;DataGrid lives (and which is not one of the core<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;SL assemblies) from getting loaded.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp; DataGrid myDataGrid = new DataGrid();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp; LayoutRoot.Children.Add(myDataGrid);</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AddDataGrid();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></span></span><span style="font-size: small;"> </span>
<p><span style="font-family: courier new,courier;"><span style="font-size: small;"><span style="color: #008000;">//prevent in-lining if method implementation is too small.</span><br />[<span style="color: #2b91af;">MethodImpl</span>(<span style="color: #2b91af;">MethodImplOptions</span>.NoInlining)] <br /><span style="color: #0000ff;">public void</span> AddDataGrid()<br />{<br />&nbsp;&nbsp;&nbsp; <span style="color: #2b91af;">DataGrid</span> myDataGrid = <span style="color: #0000ff;">new</span> <span style="color: #2b91af;">DataGrid</span>();<br />&nbsp;&nbsp;&nbsp; LayoutRoot.Children.Add(myDataGrid);<br />}</span></span></p>
</span></span></div>
</li>
</ol>
<p class="MsoListParagraphCxSpFirst"><span style="font-size: small;"><span style="font-family: Calibri;"><b style="mso-bidi-font-weight: normal;">Load Less Data<br /></b>Avoid loading content/configuration data that isn&rsquo;t needed to display your main screen.<span style="mso-spacerun: yes;">&nbsp; </span>An example could be an email client where a user&rsquo;s messages are all serialized into a flat file.<span style="mso-spacerun: yes;">&nbsp; </span>You should wait to load your message data until <i style="mso-bidi-font-style: normal;">after</i> your main window has loaded, and you&rsquo;ve had a chance to display a loading animation or otherwise show that your application is responsive.<o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">Another example could be an application that has a rich extensibility and plugin model.<span style="mso-spacerun: yes;">&nbsp; </span>Make sure that you are loading and displaying the main shell of your application before you load each of your plugins.<span style="mso-spacerun: yes;">&nbsp; </span>A single misbehaving plugin could add lots of extra time to your startup sequence!<b style="mso-bidi-font-weight: normal;"><o:p></o:p></b></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%; font-size: 12pt; mso-bidi-font-size: 11.0pt;"><span style="font-family: Calibri;">Optimizing Templates and Styles<o:p></o:p></span></span></b></p>
<p class="MsoNormal"><span style="font-family: Calibri;"><span style="font-size: small;">Having some Xaml parsed at startup to define the initial appearance of your application is unavoidable.<span style="mso-spacerun: yes;">&nbsp; </span>Because of this, be sure to optimize your initial Xaml design for startup time.<span style="mso-spacerun: yes;">&nbsp; </span>Here are a few things you should keep in mind when optimizing your Xaml.<o:p></o:p></span></span></p>
<ul>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-family: Calibri;"><span style="font-size: small;">Minimize your element count.<span style="mso-spacerun: yes;">&nbsp; </span>Every element that you add to the visual tree adds to the amount of time that it takes to parse.<span style="mso-spacerun: yes;">&nbsp;&nbsp; </span>When refactoring your Xaml, you may find yourself with elements left over in the visual tree that no longer contribute to function or appearance.<span style="mso-spacerun: yes;">&nbsp; </span>A good example of this could be a Grid with a single child and no meaningful properties set.<span style="mso-spacerun: yes;">&nbsp; </span>These types of elements should be removed!</span></span><span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font-size: small;"></span></span></span></div>
</li>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font-size: small;"></span></span></span><span style="font-family: Calibri;"><span style="font-size: small;">Remove dead XAML.<span style="mso-spacerun: yes;">&nbsp; </span>If a style or a part of your tree is no longer used, remove it!<span style="mso-spacerun: yes;">&nbsp; </span>Why pay for something that you&rsquo;re never going to see or use?</span></span><span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font-size: small;"></span></span></span></div>
</li>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font-size: small;"></span></span></span><span style="font-family: Calibri;"><span style="font-size: small;">Prefer Templates over UserControls.<span style="mso-spacerun: yes;">&nbsp; </span>UserControls need to be re-parsed per instantiation, templates are parsed only once.<span style="mso-spacerun: yes;">&nbsp; </span>This is especially important in say, a DataGrid cell template, where hundreds of cells are styled the same way.<span style="mso-spacerun: yes;">&nbsp; </span>If you style your cell using a UserControl, you are going to parse the same Xaml hundreds of times over; by using a template you ensure that this Xaml is only parsed once!</span></span><span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font-size: small;"></span></span></span></div>
</li>
<li>
<div class="MsoListParagraphCxSpFirst"><span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font-size: small;"></span></span></span><span style="font-size: small;"><span style="font-family: Calibri;">Don&rsquo;t set properties to their default values, this includes things like setting Opacity=&rdquo;1&rdquo;, or setting RenderTransforms to non-parameterized values.<span style="mso-spacerun: yes;">&nbsp; </span>Some of our design tools have a nasty habit of doing this so you may need to police their output.<span style="mso-spacerun: yes;">&nbsp; </span>We&rsquo;re working to make this better in the future.<o:p></o:p></span></span></div>
</li>
</ul>
<p>&nbsp;</p>
<p class="MsoNormal"><b style="mso-bidi-font-weight: normal;"><span style="font-size: 12pt; mso-bidi-font-size: 11.0pt;"><span style="font-family: Calibri;">Consider Using a Splash Screen<o:p></o:p></span></span></b></p>
<p class="MsoNormal"><span style="font-family: Calibri; font-size: small;">So you&rsquo;ve implemented the rest of the startup best practices, but your application is still not quite snappy enough for you?<span style="mso-spacerun: yes;">&nbsp; </span>At this point you should consider using a splash screen.<span style="mso-spacerun: yes;">&nbsp; </span>By default, Silverlight applications use a default splash screen (the spinning orbs that I&rsquo;m sure you&rsquo;re familiar with).<span style="mso-spacerun: yes;">&nbsp; </span>By replacing the default splash screen you can greatly improve perceived performance and get your own custom branding in front of the user as soon as possible.<span style="mso-spacerun: yes;">&nbsp; </span>There is an MSDN article available </span><a href="http://msdn.microsoft.com/en-us/library/cc903962(VS.95).aspx"><span style="font-family: Calibri; font-size: small;">here</span></a><span style="font-size: small;"><span style="font-family: Calibri;"> that explains the process of setting a custom splash screen. <o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: Calibri; font-size: small;">A custom splash screen in conjunction with the Xap chaining example in Tim&rsquo;s &ldquo;</span><a href="http://www.silverlight.net/learn/videos/silverlight-videos/loading-dynamic-xaps-and-assemblies/"><span style="font-family: Calibri; font-size: small;">Loading Dynamic XAPs and Assemblies</span></a><span style="font-size: small;"><span style="font-family: Calibri;">&rdquo; video mentioned under the &ldquo;Minimize your download size&rdquo; section can go a long way toward providing a responsive user experience.<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%; font-size: 12pt; mso-bidi-font-size: 11.0pt;"><span style="font-family: Calibri;">Conclusion<o:p></o:p></span></span></b></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">Application startup can be a tricky thing to master, but once you&rsquo;ve successfully driven your first real application to a fast startup the principles learned will serve you for years to come.<span style="mso-spacerun: yes;">&nbsp; </span>We&rsquo;ll be updating and correcting this page going forward, so add a bookmark and send the link out to other developers on your team.</span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: Calibri;">-Mike Cook</span></span></p>]]></content:encoded>
    </item>
  </channel>
</rss>