2011-12-26 16 views
2

私は、.NET 3.5 SP1を使用しています。デフォルトのWCFシリアライザ(DataContractSerializer)を使用しています。ちょうどウォームアップするためにサービスを最初の呼び出しでWCFのシリアル化が遅い

  1. 呼び出します「RecieveInteger」:

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

    私のクライアントは、次の処理を行います。 私はこのシンプルなインターフェイスを持っています。

  2. 'RecieveBigDataType'を10回呼び出してパフォーマンスを測定します。

「RecieveBigDataType」への10回の呼び出しを測定すると、最初の呼び出しが他の呼び出しよりもはるかに遅いことがわかりました。 WCFが 'BigDataType'型をシリアル化する必要があるのは非常に遅いようです。 最初の呼び出しを高速化するためのアイデアはありますか? MSDNによる

+0

あなたのテストはどのようにクライアントからですか? 。 .means ServiceClientオブジェクトを1回作成し、10回または新しいサービスと呼び出しメソッドを作成するたびに呼び出します。 – dotnetstep

+0

ServiceClientオブジェクトを1つだけ作成し、上記のアクション1-2を実行します。 – Sean

+0

1.最初にオブジェクトを作成するとき 2.その後、初めて通信チャネルを作成するときにWebサービスを呼び出します。だから、次回hapeendを呼び出すと、そのチャンネルが継続的に使用されるので、後続の呼び出しはより速くなります。毎回ServiceClientを作成してパフォーマンスを測定してみてください。 – dotnetstep

答えて

1

、XmlSerializerをするために、XmlSerializerを初期化

起動

のXmlSerializerタイプに遭遇した最初の時間にFromTypesを呼び出すことによって、それがシリアル化を実行するコードを生成し、そのコードをキャッシュ後で使用するために。ただし、XmlSerializerのFromTypes静的メソッドを呼び出すと、XmlSerializerは、シリアル化する予定の型の必要なコードをすぐに生成してキャッシュします。これにより、最初に特定のタイプをシリアライズするのにかかる時間が短縮されます。次の例は、このアプローチを示しています。

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

は、私はあなたが同じことをするかもしれないいくつかの方法がありDataContractSerializerを使用してWCFを使用しますが、されている知っています。

ここから:http://msdn.microsoft.com/en-us/library/ff650685.aspx

+0

私はそれを試みました(テスト用にxmlSerializerにシリアライザも変更しました)、残念ながら改善はありません。 – Sean

+0

あなたのスピンアップ時間はサービスごとに変わるかもしれません。 –

+0

確かにシリアル化の問題です。私が別のサービスオペレーションを(同じパラメータで)後に呼び出すと、速くなるでしょう。助けてくれてありがとう。 – Sean

関連する問題