2011-12-26 69 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