WCF和Entity framework 发现的性能问题(转)

最近在用entity framework 和 WCF结合做服务端,偶然发现一个问题,就是数据传输对象(DTO)的容量问题,我的项目方案是把数据访问层封装为WCF部署在外网服务器上供客户端调 用.我发现传输速度没有想象的那么好,简直就是不堪入目,终于有一天我发现问题的所在,就是edmx生成的实体类和自己手写实体类的区别,我用 District这张表来做演示,表中一共有5个字段,废话不多说,先看一代码,
下面是edmx自生成的District类代码

复制代码
  1 代码
  2 
  3 [global::System.Data.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName="ExpressPlatformModel", Name="District")]
  4     [global::System.Runtime.Serialization.DataContractAttribute(IsReference=true)]
  5     [global::System.Serializable()]
  6     public partial class District : global::System.Data.Objects.DataClasses.EntityObject
  7     {
  8         /// <summary>
  9         /// 创建新的 District 对象。
 10         /// </summary>
 11         /// <param name="districtID">DistrictID 的初始值。</param>
 12         /// <param name="cityID">CityID 的初始值。</param>
 13         /// <param name="districtName">DistrictName 的初始值。</param>
 14         public static District CreateDistrict(int districtID, int cityID, string districtName)
 15         {
 16             District district = new District();
 17             district.DistrictID = districtID;
 18             district.CityID = cityID;
 19             district.DistrictName = districtName;
 20             return district;
 21         }
 22         /// <summary>
 23         /// 架构中不存在属性 DistrictID 的注释。
 24         /// </summary>
 25         [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
 26         [global::System.Runtime.Serialization.DataMemberAttribute()]
 27         public int DistrictID
 28         {
 29             get
 30             {
 31                 return this._DistrictID;
 32             }
 33             set
 34             {
 35                 this.OnDistrictIDChanging(value);
 36                 this.ReportPropertyChanging("DistrictID");
 37                 this._DistrictID = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value);
 38                 this.ReportPropertyChanged("DistrictID");
 39                 this.OnDistrictIDChanged();
 40             }
 41         }
 42         private int _DistrictID;
 43         partial void OnDistrictIDChanging(int value);
 44         partial void OnDistrictIDChanged();
 45         /// <summary>
 46         /// 架构中不存在属性 CityID 的注释。
 47         /// </summary>
 48         [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable=false)]
 49         [global::System.Runtime.Serialization.DataMemberAttribute()]
 50         public int CityID
 51         {
 52             get
 53             {
 54                 return this._CityID;
 55             }
 56             set
 57             {
 58                 this.OnCityIDChanging(value);
 59                 this.ReportPropertyChanging("CityID");
 60                 this._CityID = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value);
 61                 this.ReportPropertyChanged("CityID");
 62                 this.OnCityIDChanged();
 63             }
 64         }
 65         private int _CityID;
 66         partial void OnCityIDChanging(int value);
 67         partial void OnCityIDChanged();
 68         /// <summary>
 69         /// 架构中不存在属性 DistrictName 的注释。
 70         /// </summary>
 71         [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable=false)]
 72         [global::System.Runtime.Serialization.DataMemberAttribute()]
 73         public string DistrictName
 74         {
 75             get
 76             {
 77                 return this._DistrictName;
 78             }
 79             set
 80             {
 81                 this.OnDistrictNameChanging(value);
 82                 this.ReportPropertyChanging("DistrictName");
 83                 this._DistrictName = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, false);
 84                 this.ReportPropertyChanged("DistrictName");
 85                 this.OnDistrictNameChanged();
 86             }
 87         }
 88         private string _DistrictName;
 89         partial void OnDistrictNameChanging(string value);
 90         partial void OnDistrictNameChanged();
 91         /// <summary>
 92         /// 架构中不存在属性 PinYin 的注释。
 93         /// </summary>
 94         [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()]
 95         [global::System.Runtime.Serialization.DataMemberAttribute()]
 96         public string PinYin
 97         {
 98             get
 99             {
100                 return this._PinYin;
101             }
102             set
103             {
104                 this.OnPinYinChanging(value);
105                 this.ReportPropertyChanging("PinYin");
106                 this._PinYin = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, true);
107                 this.ReportPropertyChanged("PinYin");
108                 this.OnPinYinChanged();
109             }
110         }
111         private string _PinYin;
112         partial void OnPinYinChanging(string value);
113         partial void OnPinYinChanged();
114         /// <summary>
115         /// 架构中不存在属性 PostalCode 的注释。
116         /// </summary>
117         [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()]
118         [global::System.Runtime.Serialization.DataMemberAttribute()]
119         public string PostalCode
120         {
121             get
122             {
123                 return this._PostalCode;
124             }
125             set
126             {
127                 this.OnPostalCodeChanging(value);
128                 this.ReportPropertyChanging("PostalCode");
129                 this._PostalCode = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, true);
130                 this.ReportPropertyChanged("PostalCode");
131                 this.OnPostalCodeChanged();
132             }
133         }
134         private string _PostalCode;
135         partial void OnPostalCodeChanging(string value);
136         partial void OnPostalCodeChanged();
137     }
复制代码


这是我手写的District类

复制代码
 1 代码
 2 
 3   [DataContract]
 4         [Serializable]
 5         public class SDistrict
 6         {
 7             public SDistrict() { }
 8             [DataMember]
 9             private int districtID = 0;
10 
11             public int DistrictID
12             {
13                 get { return districtID; }
14                 set { districtID = value; }
15             }
16             [DataMember]
17             private int cityID = 0;
18 
19             public int CityID
20             {
21                 get { return cityID; }
22                 set { cityID = value; }
23             }
24             [DataMember]
25             private string districtName = string.Empty;
26 
27             public string DistrictName
28             {
29                 get { return districtName; }
30                 set { districtName = value; }
31             }
32             [DataMember]
33             private string pinYin = string.Empty;
34 
35             public string PinYin
36             {
37                 get { return pinYin; }
38                 set { pinYin = value; }
39             }
40             [DataMember]
41             private string postalCode = string.Empty;
42 
43             public string PostalCode
44             {
45                 get { return postalCode; }
46                 set { postalCode = value; }
47             }
48 
49         }
复制代码


大家都看见了,edmx生成的和手写的District结构都是一模一样的,同样都有DataContract这个类属性,可以序列化和反序列化.下面是我Service中返回不同实体集合的一段代码,

自定义District类获取方法

复制代码
 1 代码
 2 
 3   public List<SDistrict> initBuffByDistrict() //自己手写的实体类
 4         {
 5             
 6             using (ExpressPlatformEntities db = new ExpressPlatformEntities())
 7             {
 8 
 9                 List<District> result = db.District.ToList<District>();
10                 List<SDistrict> result1 = new List<SDistrict>(result.Count);
11                 for (int i = 0; i < result.Count; i++)
12                 {
13                     SDistrict sd = new SDistrict();
14                     sd.DistrictID = result[i].DistrictID;
15                     sd.DistrictName = result[i].DistrictName;
16                     sd.CityID = result[i].CityID;
17                     sd.PinYin = result[i].PinYin;
18                     sd.PostalCode = result[i].PostalCode;
19                     result1.Add(sd);
20                 }
21               
22                
23                
24                 return result1;
25             }

复制代码

edmx生成的District类获取方法

复制代码
1 代码
2 
3         public List<District> GetDistrictList()
4         {
5             using (ExpressPlatformEntities db = new ExpressPlatformEntities())
6             {
7                 return db.District.ToList();
8             }
9         }


复制代码

 

客户端使用http协议调用这两个方法的结果我用Fiddler测试工具抓取响应的消息所获得才恍 然大悟啊,请看下面

测试返回省市区表对象3304,以下是用entity framework 自生成的实体集合

==================================================================

Request Count: 1 //请求数

Bytes Sent: 1,090//发送字节数

Bytes Received: 2,462,366 //接收字节数

 

ACTUAL PERFORMANCE

--------------

Requests started at:10:24:09:1406 //请求开始

Responses completed at:10:24:17:5781 //响应返回

Aggregate Session time:00:00:08:4375 //耗时

Sequence (clock) time:00:00:08.4375000 //总耗时

 

 

测试返回省市区表对象3304,以下是用手写的实体集合

===============================================

Request Count: 1//请求数

Bytes Sent: 1,088//发送字节

Bytes Received: 634,171//接收字节

 

ACTUAL PERFORMANCE

--------------

Requests started at:10:16:07:2500//请求开始

Responses completed at:10:16:09:5625//响应返回

Aggregate Session time:00:00:02:3125//耗时

Sequence (clock) time:00:00:02.3125000//总耗时

 

 

===================华丽的分割线========================================

 

相差了6秒多,而且字节数相差了4倍左右,3304个实体的数据总量一共是600K左右,传600K数据需要8秒?

 

我把这两个集合序列化到文本一看,一个edmx生成的实体类集合有2.33MB的容量,手写的实体集合只有610K,实际上手写的

 

实体集合序列化为Soap-XML进行传输的时候那些声明数据的类型的XML节点只占用了10K的大小,而通过edmx生成的

 

Soap-XML包含了edmx的许多属性,这样就能得出为什么手写的比生成的快了.

 

http://www.cnblogs.com/tonykan/archive/2012/12/16/2820117.html



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: .NET Framework是Microsoft的一个应用程序框架,它提供了在Windows操作系统上运行的各种应用程序所需的工具和服务。.NET Framework 3.5是.NET Framework的一个版本,它包括了.NET Framework 2.0和3.0两个版本,进一步扩展了其功能和特性。 .NET Framework 2.0是一个主流版本,拥有一系列改进和新增功能,包括更好的安全性,更好的性能和互操作性,更好的控件和类库等。.NET Framework 3.0添加了更多的功能,如Windows Presentation Foundation(WPF),Windows Communication Foundation(WCF)和Windows Workflow Foundation(WWF)等。这些技术都是针对不同领域的应用程序所需的,如网站开发、桌面应用程序、数据库应用程序等。 .NET Framework 3.5进一步增强了.NET Framework的特性,包括了一些新的功能,例如LINQ(Language Integrated Query),ASP.NET AJAX和ADO.NET Entity Framework等。这些功能可以极大地提高应用程序的开发效率和性能,并且可以使开发人员更容易地编写高质量、高效和可扩展的应用程序。 总之,.NET Framework 3.5是一个重要的版本,它整合了.NET Framework 2.0和3.0的特性,并提供了更多的功能和特点。对于需要在Windows操作系统上运行的应用程序来说,.NET Framework 3.5是一个必备的组件。 ### 回答2: .NET Framework 3.5是一个Microsoft开发的软件框架,包括了.NET 2.0和3.0两个版本。它提供了一套标准的库和支持多种语言,能够使开发人员更加容易地创建和管理应用程序。.NET Framework 3.5在开发web应用程序和windows应用程序方面都有很强的功能,能够提升开发效率和程序的运行速度。 在.NET Framework 3.5中,包含了许多新增的功能,如LINQ(Language Integrated Query)和WCF(Windows Communication Foundation),以及对ASP.NET AJAX、ASP.NET Dynamic Data等功能的加强,同时还能够支持Windows Workflow Foundation(WF)。这些功能的加入,使.NET Framework 3.5成为了一个更加强大、更加灵活的平台。 在实际应用中,.NET Framework 3.5能够为开发人员提供很多便利。它提供了许多可重用的类和方法,避免了开发人员重复编写一些基本功能代码的麻烦。同时,它还提供了一些自动化工具,如Visual Studio建议工具、自动完成器等,使开发人员能够更轻松地编写代码。并且,它还能够支持多种编程语言,如C#、VB.NET、F#等,使得开发人员能够选用自己熟悉的语言进行开发。 总的来说,.NET Framework 3.5是一个功能丰富、灵活可靠的开发平台,拥有着众多的优点和特点,能够显著提升开发人员的工作效率和应用程序的质量。 ### 回答3: .NET Framework 3.5 是微软开发的一个开源框架,它包括了.NET 2.0和3.0,并添加了新的特性和功能。这个框架可以让开发者更容易地编写和运行Windows应用程序,同时也提供了许多开发及运行时的支持和工具。 在.NET Framework 3.5中,最重要的特性之一是Linq。它是一种数据查询技术,可以在任何数据源中执行强类型查询,并将结果作为对象来操作。使用Linq,开发者可以在编译时检索错误,大大减少了代码错误并增加了应用程序的性能。 另一个与.NET Framework 3.5相关的特性是WPF(Windows Presentation Foundation),它可以帮助开发者更好地创建交互式的用户界面。WPF使用XAML来定义界面,允许开发者构建更美观和更复杂的UI控件。 除此之外,.NET Framework 3.5还提供了许多重要的特性,例如Windows Communication Foundation(WCF)、Windows Workflow Foundation(WWF)和Windows CardSpace。这些框架可用于构建分布式应用程序、工作流和安全身份验证系统等。 总体来说,.NET Framework 3.5是非常重要的一个框架,可帮助开发者更快速、更容易地构建高质量的Windows应用程序,同时,也为应用程序提供了更强大、更高效的部署机制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值