0

誰かが改善/推奨事項を見つけることができれば、この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>

for-each を最適化する方法はありますか? また、それはどのように役立ちますか? アクティブなクラブの数が増えるにつれて、CPU がゆっくりと噛まれていくのを見ているので、これが部分的な原因であると思いますか?

編集:

予想される出力は変数 ClubId で、初回は 1234、2 回目は 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# コードはそれらを DB に書き込み、成功のコードを返します。これは環境を通じて他の場所に渡されます。私が言うように、それは期待どおりに機能しますが、アクティブなクラブの数を増やすと、パフォーマンスが大幅に低下することがわかります.

4

1 に答える 1

0

xslt全体を投稿できますか?

パフォーマンスの問題は、あなたが示した xslt の一部ではないと確信しています。

Thread.Sleep()C# スクリプトで10ms の遅延を導入して DB 書き込み呼び出しをシミュレートしながら、2000 のアクティブ クラブのリストで、VS の ms xsl プロセッサを介して以下の xslt を実行しました。結果は次のとおりです。

スタイルシートの読み込み時間: 25.12 ミリ秒 スタイルシートの実行時間: 20125 ミリ秒

つまり、スリープを除外すると、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>
于 2012-11-15T16:15:26.247 に答える