2011-12-26 22 views
2

我正在使用.Net 3.5 SP1,使用默認的WCF序列化程序 - DataContractSerializer。 我有這個簡單的接口:WCF序列化在第一次調用時很慢

[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    void RecieveInteger(int value); 

    [OperationContract] 
    void RecieveBigDataType(BigDataType value); 
} 

我的客戶將執行以下操作:

  1. 調用「RecieveInteger」只是熱身的服務。
  2. 10次調用「RecieveBigDataType」並測量性能。

測量對'RecieveBigDataType'的10個調用,我發現第一個調用比其他調用慢得多。這似乎是WCF第一次需要序列化「BigDataType」類型的速度非常緩慢。 任何想法使第一個電話更快?

+0

如何從客戶端進行測試? 。 .means創建ServiceClient對象一次,並調用它10次或每次創建新的serviceclient和調用方法。 – dotnetstep 2011-12-26 09:07:30

+0

只創建一個ServiceClient對象,然後執行上面寫的動作1-2。 – Sean 2011-12-26 09:16:00

+0

1.當你第一次創建對象時 2.然後你第一次打電話給web服務時它會創建通信channgel。所以當下次調用hapeend時,它會繼續使用該頻道,以便後續調用速度更快。嘗試每次創建ServiceClient並衡量性能不同。 – dotnetstep 2011-12-26 10:04:50

回答

1

根據MSDN爲XmlSerializer的

初始化XmlSerializer的通過,在啓動時

第一次的XmlSerializer遇到類型調用FromTypes,它生成代碼,以執行串行化,然後將其緩存該代碼供以後使用。但是,如果您在XmlSerializer上調用FromTypes靜態方法,則會強制XmlSerializer立即生成並緩存您計劃序列化的類型所需的代碼。這減少了第一次序列化特定類型所花費的時間。以下示例顯示了此方法。

static void OnApplicationStart() 
{ 
    Type[] myTypes = new Type[] { Type.GetType("customer"), Type.GetType("order") }; 
    XmlSerializer.FromTypes(myTypes); 
} 

我知道你正在使用WCF它使用DataContractSerializer的,但有可能一些方式做同樣的事情。

從這裏:http://msdn.microsoft.com/en-us/library/ff650685.aspx

+0

我試過了(也改變了我的序列化程序到xmlSerializer進行測試),不幸的是沒有任何改進。 – Sean 2011-12-27 13:12:16

+0

也許你的起轉時間是在每個服務運營的基礎上。 – 2011-12-27 15:34:15

+0

這確實是一個序列化問題。如果之後我會調用另一個服務操作(使用相同的參數),它會很快。感謝您的幫助。 – Sean 2011-12-28 06:36:58

相關問題