英文原文:http://www.codeproject.com/Articles/45298/Array-instead-of-List-in-WCF
最近我正在开发一个在消息报文中传输image的函数,因此习惯性地在消息类中建立了一个类似这样的属性:public List<byte> Image { get; set; }
Image数据通过duplex channel传到客户端,你能想象我是多么惊讶地看到服务进程的CPU消耗吗?约400K的Image CPU达到了15-20%。我必须考虑一个更好的方案了。以下是WCF中duplex channel的结构:
[ServiceContract(CallbackContract = typeof(IServiceCallback),
SessionMode = SessionMode.Required)]
public interface IService
{
[OperationContract(IsOneWay = true)]
void SendData(List<byte> array);
}
public interface IServiceCallback
{
[OperationContract(IsOneWay = true)]
void RecieveData(List<byte> array); //this is duplex receiver of image
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession,
ConcurrencyMode = ConcurrencyMode.Multiple,
MaxItemsInObjectGraph = Int32.MaxValue)]
public class Service : IService
{
public void SendData(List<byte> array)
{
IServiceCallback callback =
OperationContext.Current.GetCallbackChannel<IServiceCallback>();
callback.RecieveData(array);
//Receiving of message back to user.
//It is simple exaple is only to show high duplex performance.
}
}
搜索这个问题的解决方案花了我相当数量的时间,然后以字节数组(array of bytes)替换List<byte>得到了更好的结果:CPU基本1-2%。为什么几乎相同类型的数据结果存在这么大的差异?
不同点在于SOAP消息如何生成:
对于List<byte>:
...
<s:Body u:Id="_0"
xmlns:u="http://docs.oasis-open.org/wss/2004/01/
oasis-200401-wss-wssecurity-utility-1.0.xsd">
<SendData xmlns="http://tempuri.org/">
<array
xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:unsignedByte>0</a:unsignedByte>
<a:unsignedByte>0</a:unsignedByte>
<a:unsignedByte>0</a:unsignedByte>
<a:unsignedByte>0</a:unsignedByte>
<a:unsignedByte>0</a:unsignedByte>
<a:unsignedByte>0</a:unsignedByte>
<a:unsignedByte>0</a:unsignedByte>
<a:unsignedByte>0</a:unsignedByte>
<a:unsignedByte>0</a:unsignedByte>
<a:unsignedByte>0</a:unsignedByte>
<a:unsignedByte>0</a:unsignedByte>
<a:unsignedByte>0</a:unsignedByte>
...
</array>
</SendData>
</s:Body>
...
对于字节数组:
...
<s:Body u:Id="_0"
xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<SendData xmlns="http://tempuri.org/">
<array>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</array>
</SendData>
</s:Body>
...
通常,两种不同的SOAP消息大小大约相差10倍,消息报文大小相同的情况下CPU消耗能够从15-20%降到1-3%。我很惊讶,因为关于这个差异我没有找到任何官方资料。