WCF序列化在第一次调用时很慢
本文关键字:调用 第一次 序列化 WCF | 更新日期: 2023-09-27 18:18:44
我使用的是。net 3.5 SP1,使用默认的WCF序列化器- DataContractSerializer。我有这样一个简单的接口:
[ServiceContract]
public interface IService
{
[OperationContract]
void RecieveInteger(int value);
[OperationContract]
void RecieveBigDataType(BigDataType value);
}
我的客户执行以下操作:
- 调用' receiveinteger '来预热服务。
- 调用' receivebigdatatype ' 10次并测量性能。
测量对'RecieveBigDataType'的10个调用,我发现第一个调用比其他调用慢得多。似乎WCF第一次需要序列化类型"BigDataType"的速度很慢。有什么办法能让第一通电话打得更快吗?
根据MSDN,对于XmlSerializer,
通过在启动时调用FromTypes初始化XmlSerializer
XmlSerializer第一次遇到一个类型时,它生成执行序列化的代码,然后缓存该代码以供以后使用。但是,如果在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
我在DataContractJsonSerializer
中遇到了几乎相同的问题。在我的例子中,对DataContractJsonSerializer.WriteObject(..)
的第一次调用比对同一对象的其他调用多花了1.3秒。
老实说,序列化的对象有一些接口,所以必须定义KnownTypes
。
我发现的唯一工作是在应用程序启动时运行Task
并序列化已知类型的虚拟对象。
有趣的是,在线程池上虚拟对象的序列化比在GUI上少花0.5秒的时间。
Task.Run(() =>
{
var knownTypes = new[] { typeof(ServiceImpl_1), typeof(ServiceImpl_2), typeof(ServiceImpl_3)};
var ser = new System.Runtime.Serialization.Json.DataContractJsonSerializer
(
typeof(IService),
new DataContractJsonSerializerSettings { KnownTypes = knownTypes }
);
using(var ms = new MemoryStream())
{
foreach(var tp in knownTypes)
{
object inst = null;
try
{
foreach(var ctorInf in tp.GetConstructors())
{
try
{
var prInfos = ctorInf.GetParameters();
if(prInfos.Length == 0)
{
inst = Activator.CreateInstance(tp);
}
else
{
var parList = new object[prInfos.Length];
for(int i = 0; i < prInfos.Length; i++)
{
parList[i] = prInfos[i].ParameterType.IsValueType ? Activator.CreateInstance(prInfos[i].ParameterType) : null;
}
inst = Activator.CreateInstance(tp, parList);
}
}
catch(Exception)
{
continue;
}
ser.WriteObject(ms, inst);
}
}
catch(Exception exc) {}
}
}
}