如果有人能发现任何改进/推荐,我想稍微优化这个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#代码将它们写入数据库,返回成功的代码,并通过环境传递给其他地方。 正如我所说,它按预期工作,但是当我增加活跃的俱乐部数量时,我看到了显着的性能损失。
答案 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>