2012-11-15 53 views
0

如果有人可以發現任何改進/建議,我正在尋找優化這個XSLT的方法嗎?我的XSLT1的性能優化

我收到沿着這種格式的下面的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

我想你可以在這裏使用** xsl:key **。您能否在這種情況下展示完整的XSLT和您的預期輸出,因爲這將有助於我們充分理解和分析這種情況。謝謝! –

+0

@TimC - 爲你做到了 - 我能展示的任何其他幫助? – Chris

+0

嗯..我不確定這個問題是在XSLT這裏。如果爲每個俱樂部調用數據庫,則需要確保數據庫過程儘可能優化。是否有可能只調用一次數據庫,但一次傳入所有活動的俱樂部(例如,作爲逗號分隔的列表?) –

回答

0

您可以發佈整個xslt嗎?

我敢肯定,性能問題不在您所展示的xslt中。

我跑通過VS ms的XSL處理器以下XSLT,2000年活躍的俱樂部名單上,而模擬您的數據庫在C#腳本Thread.Sleep()引入10ms的延遲寫調用,並且結果是:

樣式表加載時間:25.12毫秒 樣式表的執行時間:20125毫秒

即2000俱樂部在125ms的,如果你排除睡覺。

所以這個問題肯定是在別的地方,例如, 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>