我的XSLT1的性能优化

时间:2012-11-15 11:00:56

标签: xslt optimization biztalk

如果有人能发现任何改进/推荐,我想稍微优化这个XSLT吗?

我收到一个XML文件,后面跟着这种格式:

<TransfersToComplete>
    <TransfersForFees>
        <Transfer>
            <PlayerID>1234</PlayerID>
            <ClubJoiningID>4444</ClubJoiningID>
            <FeeInPounds>1200000</FeeInPounds>
        </Transfer>
        <Transfer>
            <PlayerID>3835</PlayerID>
            <ClubJoiningID>4444</ClubJoiningID>
            <FeeInPounds>5000000</FeeInPounds>
        </Transfer>
        <Transfer>
            <PlayerID>17118</PlayerID>
            <ClubJoiningID>5229</ClubJoiningID>
            <FeeInPounds>18000000</FeeInPounds>
        </Transfer>
    </TransfersForFees>
    <FreeAgencyTransfers>
        <FreeTransfer>
            <PlayerID>42323</PlayerID>
            <ClubJoiningID>332</ClubJoiningID>
        </FreeTransfer>
    </FreeAgencyTransfers>
</TransfersToComplete>

我还有另一个XML文件,其中包含“活跃”俱乐部列表(即由玩家而不是AI控制的俱乐部)

    <ActiveClubs>
<Club><ClubID>1234</ClubID></Club>
    <Club><ClubID>4482</ClubID></Club>
    </ActiveClubs>

我在双输入映射中加入了这些作为Biztalk解决方案的一部分,因此输入文档看起来像这样:

<Root>
    <InputMessage0>
        <ActiveClubs>
            <Club>
                <ClubID>1234</ClubID>
            </Club>
            <Club>
                <ClubID>4482</ClubID>
            </Club>
        </ActiveClubs>
    </InputMessage0>
    <InputMessage1>
        <TransfersToComplete>
            <TransfersForFees>
                <Transfer>
                    <PlayerID>1234</PlayerID>
                    <ClubJoiningID>4444</ClubJoiningID>
                    <FeeInPounds>1200000</FeeInPounds>
                </Transfer>
                <Transfer>
                    <PlayerID>3835</PlayerID>
                    <ClubJoiningID>4444</ClubJoiningID>
                    <FeeInPounds>5000000</FeeInPounds>
                </Transfer>
                <Transfer>
                    <PlayerID>17118</PlayerID>
                    <ClubJoiningID>5229</ClubJoiningID>
                    <FeeInPounds>18000000</FeeInPounds>
                </Transfer>
            </TransfersForFees>
            <FreeAgencyTransfers>
                <FreeTransfer>
                    <PlayerID>42323</PlayerID>
                    <ClubJoiningID>332</ClubJoiningID>
                </FreeTransfer>
            </FreeAgencyTransfers>
        </TransfersToComplete>
    </InputMessage1>
</Root>

我不希望游戏中的每个玩家看到每次转移的全部工作,所以我只限于他们自己的俱乐部,我的XSLT如下:

    <xsl:for-each select="/*[1]/ActiveClubs/Club">
<xsl:variable name ="clubId" select="current()/ClubID/text()"/>
<...CallTemplate...>
</xsl:for-each>

有没有办法可以为每个人优化它,它有什么帮助?随着活跃俱乐部的数量增长,我看到我的CPU慢慢被咀嚼,所以我认为这是一个部分原因?

编辑:

预期输出将是变量ClubId第一次是1234,第二次是4482

在我上面的例子中(2个活跃的俱乐部),我看到很少/没有表演降级 - 当我到达40岁以后...

在显示XSLT的其余部分方面 - 这是它调用的模板:

<xsl:call-template name="DoPaidTransfers">
  <xsl:with-param name="var:ClubId" select="$clubId"/>
</xsl:call-template>

这是:

  <xsl:template name="DoPaidTransfers">
<xsl:param name="var:ClubId"/>
<responseCode><xsl:value-of select="CSharpCodeCall:DoPaidTransfers($clubId)"/></responseCode>
</xsl:template>

我的C#代码将它们写入数据库,返回成功的代码,并通过环境传递给其他地方。 正如我所说,它按预期工作,但是当我增加活跃的俱乐部数量时,我看到了显着的性能损失。

1 个答案:

答案 0 :(得分:0)

请你发布整个xslt吗?

我很确定性能问题不在你所展示的xslt中。

我通过VS中的ms xsl处理器运行以下xslt,列在2000个Active Clubs上,同时通过在C#脚本中引入Thread.Sleep()的10ms延迟来模拟数据库写入调用,结果如下:

  

样式表加载时间:25.12毫秒   样式表执行时间:20125 ms

即。如果排除睡眠,可以在125毫秒内使用2000个俱乐部。

所以问题肯定在其他地方,例如TransfersToComplete中的数据如何影响地图?

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:CSharpCodeCall="http://schemas.microsoft.com/BizTalk/2003/userCSharp"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:var="YourNSForVariables"
                exclude-result-prefixes="var msxsl CSharpCodeCall"
                >
    <xsl:template match="/">
        <xsl:for-each select="//*[1]/ActiveClubs/Club">
            <xsl:variable name ="clubId" select="current()/ClubID/text()"/>
            <club>
                <clubid>
                    <xsl:value-of select="$clubId"/>
                </clubid>
                <xsl:call-template name="DoPaidTransfers">
                    <xsl:with-param name="var:ClubId" select="$clubId"/>
                </xsl:call-template>
            </club>
        </xsl:for-each>
    </xsl:template>

    <xsl:template name="DoPaidTransfers">
        <xsl:param name="var:ClubId"/>
        <responseCode>
            <xsl:value-of select="CSharpCodeCall:DoPaidTransfers($var:ClubId)"/>
        </responseCode>
    </xsl:template>

    <msxsl:script language="C#" implements-prefix="CSharpCodeCall">
        <![CDATA[
        // I've stubbed this as a 10ms delay
        public System.String DoPaidTransfers(System.String clubId)
        {
            System.Threading.Thread.Sleep(10);
            return "Transferred";
        }
        ]]>
    </msxsl:script>

</xsl:stylesheet>