为什么ServiceStack返回POCO对象比.NET Remoting返回DataSet要慢?

时间:2015-01-01 16:07:37

标签: servicestack

我从服务中返回一个包含6100行和156列的DataTable。

When returning it over .NET remoting it takes 1800 ms.
When returning it over .NET remoting with optimized DataSet serialization, it takes 1350 ms.

When just downloading a List<T> from ServiceStack (selfhosted) like this:
webClient.DownloadData("http://localhost:1337/hello/xx"); it takes 1400 ms

when returning the same list as really typed list - List<T>
var restClient = new JsonServiceClient("http://localhost:1337/hello");
all = restClient.Get<HelloResponse>("/xx"); it takes 2100 ms

对我而言,似乎从ServiceStack服务返回POCO对象列表比返回类型化DataSet的.NET Remoting慢。

在这种情况下,T看起来像这样(它具有相当多的可空属性和156个属性的tolal):

public partial class Nmbr
{       
    public Int32 NmbrID {get;set;}
    public Int32 NmbrNmBaID {get;set;}
    public Int32 NmbrNmStID {get;set;}
    public Int32 NmbrNmInID {get;set;}
    public String NmbrDesc {get;set;}
    public Int32? SestID {get;set;}
    public Int32? SestProjID {get;set;}

.... ....

我做错了什么?
为什么返回List比返回DataSet要慢? 所有方法共享相同的机制来从数据库获取数据......对我而言,似乎ServiceStack中的反序列化很慢。使用webClient.DownloadData下载数据比默认的DataSet序列化更快,但根据我的测量结果将其转换为类型化列表会增加700毫秒。

1 个答案:

答案 0 :(得分:1)

无法查看或运行您的代码来比较和验证性能花费的位置我建议使用自我描述格式(如JSON)在返回完整的整数类型的POCO时不是最佳的对于每一行都重复输入类型,当您拥有大多数数字时,意味着大部分有效负载正在序列化/反序列化模式而不是数据,例如:

 [{"NumbrId":0,"NmbrNmBaID":0,"NmbrNmStID":0,...,etc},...]

您还应查看并比较序列化数据的大小,以了解架构中的有效负载开销与原始数据的比例。

当你打电话时也要清楚:

webClient.DownloadData("http://localhost:1337/hello/xx");

您只是下载原始序列化数据,这种数据总是比将其反序列化为类型化POCO更快。您也可以使用ServiceStack's .NET Service Clients下载原始数据:

var bytes = restClient.Get<byte[]>("http://localhost:1337/hello/xx");

因此,您可以比较从ServiceClient和WebClient下载内容的性能。

考虑使用最佳数据格式

对于像这样的大型表格/数值数据集,考虑使用ServiceStack(如Protocol BuffersMessage Pack的更优化二进制格式,这将大大受益,因为它们不需要在每一行中重复架构。对于基于文本的格式,出于同样的原因,即使CSV也更适合传输表格数据。

您还可以使用Custom Serialization with Structs来改善DataStets上的ServiceStack JSON Serializer的性能,这也可以节省重复架构的开销。