Sandcastle Performance improvements in February CTP

David Smith made some great observations regarding Sandcastle perf. issues on large assemblies at We have been testing our code on Phoenix ( assemblies and here is what we found:


Prototype Style

VS2005 Style

Topic number



One big reflection file



One reflection file per assembly



One reflection file per assembly and not using MSDNWebService




1. Using ApplyVSDocModel for vs2005 transforms and AddOverloads for Prototype transform;

2. Memory peak value: one big file (600MB), one file per assembly (200MB).

3. The project tested was Phoenix ( assemblies.


As far as the difference between ApplyVSDocModel and AddOverloads, ApplyVSDocModel is doing what AddOverloads does plus a lot more, so it's to be expected that it will take significantly longer. We looked at the ApplyVSDocModel code and didn't see any obvious places to make perf improvements.


However when building phoenix documents, we found a performance issue during the CHM build process.

To create CHM contents file, we used the following command.

XslTransform /xsl:..\..\ProductionTransforms\ReflectionToChmContents.xsl reflection.xml /arg:html=Output\html /out:Output\test.hhc


In ReflectionToChmContents.xsl, xsl:document() is used to get topic title.

<xsl:value-of select="document(concat($html,'/', file/@name, '.htm'),.)/html/head/title"/>

         <xsl:value-of select="document(concat($html,'/', key('index',$overloadId)/file/@name, '.htm'),.)/html/head/title"/>


When applying this xsl, the xsltransform consumed all system memory. For building Phoenix documentation, the process took an hour to create this hhc file because the cache mechanism of xsl:document(), all html files are loaded into memory and not released.


In February CTP we have addressed this issue by creating a user defined function to replace xsl:document().


<xsl:stylesheet version="1.0"





 <msxsl:script language="C#" implements-prefix="ddue">
  <msxsl:using namespace="System.Xml" />
  <msxsl:using namespace="System.Xml.XPath" />
   public static string getTitle(string fileName) {
    XPathDocument doc = new XPathDocument(fileName);
    XPathNavigator node = doc.CreateNavigator().SelectSingleNode("/html/head/title");
    if (node != null)
     return node.Value;
     return String.Empty;


This function is used at:

  <xsl:value-of select="ddue:getTitle(concat($html,'/', @file, '.htm'))"/>


The perf improvement is lot better with February CTP. For phoenix project, it takes about 4 minutes to generate hhc file compared to 1 hour before.



Comments (5)

  1. djMax says:

    and we can download this CTP from….???

  2. Sandcastle says:

    I am excited to announce the availability of March 2007 CTP version for Sandcastle. The latest version

  3. CoqBlog says:

    Une nouvelle CTP de Sandcastle est disponible . Au menu : What’s new in this version: Added 4 new transforms

  4. CCNetConfig says:

    Announcing March 2007 Sandcastle CTP

  5. Sandcastle says:

    Please see my blog about Sandcastle September 2007 release . With this release, we plan on shipping a

Skip to main content