您的位置:首页 > 编程语言 > ASP

Repeater与DataGrid的效率,到底哪个的更好?!(结论很可能和你认为的不一样!)

2006-10-03 17:05 976 查看
我以往的人像是:Repeater   要比   DataGrid   的效率好,但是不测试不知道,一测试吓一跳!  
   
  我用   vs自带的那个压力测试软件   (ACT)   测试了一下二者的性能,用每秒可以支持的访问人数来作为衡量标准。  
   
  但是结果却出乎我的意料,DataGrid   的效率   要比   Repeater高!  
   
  详细说一下我的测试方法,请大家看看我的测试方法有没有什么问题,如果没有什么问题的话,那么发生这种想象的原因是什么呢?  
   
   
  硬件:cpu:AMD   XP2000+   、80G硬盘、512M内存。  
  软件:windows   2003   +   sp1     、Vs2003     、SQL   Server   2000   +   sp4  
   
  测试数据:显示一张表(城市表)里的数据,4个字段,349条记录。  
   
  测试目的:网站的页面里面显示数据的效率。只测试显示数据的功能,不管其他的方面。  
   
   
  测试条件:  
  1、   ViewState   是否开启  
  2、   显示10条记录、和显示   349条记录。  
  3、   DataGrid   、   Repeater  
   
  总的来说   DataGrid   总是要比   Repeater   多“容纳”几十人。  
   
  尤其是在关闭   ViewState     的情况下。  
   
  DataGrid使用自动填充,repeater的代码。  
   
  <table   id="DG"   >  
  <asp:repeater   id="Rpt_Test"   runat="server">  
  <ItemTemplate>  
  <tr>  
  <td><%#   DataBinder.Eval(Container,   "DataItem.CityID")%></td>  
  <td><%#   DataBinder.Eval(Container,   "DataItem.ProvinceID")%>  
  </td>  
  <td><%#   DataBinder.Eval(Container,   "DataItem.City")%>  
  </td>  
  <td><%#   DataBinder.Eval(Container,   "DataItem.AeraCode")%>  
  </td>  
  </tr>  
  </ItemTemplate>  
  </asp:repeater></table>  
   
   
  关于   repeater   还有没有其他的绑定方法了呢?  
   
   
  常看到一些文章说     repeater   比   DataGrid的性能要好,但是,我的测试结果是怎么回事呢?  
   
  建议大家也做一下这样的测试。我也很怀疑我的测试结果,但是也找不到什么原因。  
   
  希望大家能够一起研究一下。  
   
   
 
问题点数:200、 回复次数:129

1楼  jyk   (喜欢编程。和气生财。共同提高。共同进步)

 回复于 2006-03-15 18:57:51  得分 0

建议做完测试之后在说自己的想法。

Top

2楼  topso   (小刀)

 回复于 2006-03-15 19:07:59  得分 2

那个压力测试怎么用啊?  
  我怎么找不到?

Top

3楼  cat_hsfz   (我的Blog在http://purl.oclc.org/NET/cathsfz)

 回复于 2006-03-15 19:08:22  得分 2

估计主要问题在于数据绑定形式的差别上吧,你用Reflector打开ASP.NET运行时临时目录中的临时dll看看吧,我也没看过,所以也不知道。  
   
  你试一下把那些<tr><td>变成字符串的形式,放到<%#   %>里面,也就是说多个数据绑定项和"<tr>"、"<td>"进行字符串拼接,看看如何。

Top

4楼  mmqingfeng   (漠漠青峰)

 回复于 2006-03-15 19:11:02  得分 1

有趣啊,我先砸块砖头~~  
   
  关闭   ViewState   的时候,写入客户端的数据量基本一致,所以效率应该是在数据绑定上的差异了,  
  DataBinder.Eval()是使用反射的方法,  
  TypeDescriptor.GetProperties(Container).Find(proName)  
   
  但在内部也使用了索引作为缓存的,应该也不会慢到哪儿去的呀  
  GetIndexedPropertyValue()  
   
  难道datagrid的自动绑定有更好的优化?  
   
  等待高人.....

Top

5楼  coolbamboo2008   (寒竹)

 回复于 2006-03-15 19:11:38  得分 1

学习啊,不过datagrid的效率不应该太高的

Top

6楼  dh20156   (风之石)

 回复于 2006-03-15 19:13:35  得分 1

关注

Top

7楼  jyk   (喜欢编程。和气生财。共同提高。共同进步)

 回复于 2006-03-15 19:27:48  得分 0

最新的测试结果:  
   
  显示   10条记录   ,没有   ViewState   ,DataTable   绑定控件,DataGrid使用绑定列。  
   
  1、   DataGrid   :   250   rps   左右。  
   
  2、   Repeater   :   <%#   DataBinder.Eval(Container,   "DataItem.CityID")%>   方法:   200   rps   左右。  
   
  3、Repeater   :   <%#   ((DataRowView)Container.DataItem)["CityID"]   %>   方法   :   250   rps     多一点点。  
   
  4、Repeater   :   <%#   ((DataRowView)Container.DataItem)[0]   %>   方法   :   250   rps     多一点点。  
   
  其中   3、4   是我刚找到的一种绑定数据的方法。  
   
  看来是   <%#   DataBinder.Eval(Container,   "DataItem.CityID")%>   这种绑定方法效率太低了。  
   
  我一直都是在用这种方法呀,你呢?  
   
   
 

Top

8楼  jyk   (喜欢编程。和气生财。共同提高。共同进步)

 回复于 2006-03-15 19:30:42  得分 0

ACT   :   开始   ——   程序   ——   VS   2003   ——   企业办功能   ,在这里有。  
   
  转载   ===================  
  三、数据的绑定DataBinder  
   
    一般的绑定方法<%#   DataBinder.Eval(Container.DataItem,   "字段名")   %>用DataBinder.eval   绑定不必关心数据来源(Dataread或dataset)。不必关心数据的类型eval会把这个数据对象转换为一个字符串。在底层绑定做了很多工作,使 用了反射性能。正因为使用方便了,但却影响了数据性能。来看下<%#   DataBinder.Eval(Container.DataItem,   "字段名")   %>。当于dataset绑定时,DataItem其实式一个DataRowView(如果绑定的是一个数据读取器(dataread)它就是一个 IdataRecord。)因此直接转换成DataRowView的话,将会给性能带来很大提升。  
   
    <%#   ctype(Container.DataItem,DataRowView).Row("字段名")   %>  
   
    *对数据的绑定建议使用<%#   ctype(Container.DataItem,DataRowView).Row("字段名")   %>。数据量大的时候可提高几百倍的速度。使用时注意2方面:1.需在页面添加<%@   Import   namespace="System.Data"%>.2.注意字段名的大小写(要特别注意)。如果和查询的不一致,在某些情况下会导致比< %#   DataBinder.Eval(Container.DataItem,   "字段名")   %>还要慢。如果想进一步提高速度,可采用<%#   ctype(Container.DataItem,DataRowView).Row(0)   %>的方法。不过其可读性不高。  
   
    以上的是vb.net的写法。在c#中:<@%   ((DataRowView)Container.DataItem)["字段名"]   %>    
   
   
  =======================

Top

9楼  jyk   (喜欢编程。和气生财。共同提高。共同进步)

 回复于 2006-03-15 19:39:52  得分 0

多数据测试    
   
  显示   349   条记录   在一页里显示,没有   ViewState   ,DataTable   绑定控件,DataGrid使用绑定列。  
   
  1、   DataGrid   :   50到60   rps   之间跳动。  
   
  2、   Repeater   :   <%#   DataBinder.Eval(Container,   "DataItem.CityID")%>   方法:   20   rps   左右。  
   
  3、Repeater   :   <%#   ((DataRowView)Container.DataItem)["CityID"]   %>   方法   :   88   rps   左右。  
   
  4、Repeater   :   <%#   ((DataRowView)Container.DataItem)[0]   %>   方法   :   90   rps   左右。  
   
   
 

Top

10楼  ljhkim6   ()

 回复于 2006-03-15 19:46:05  得分 1

我觉得要看情况  
  那种情况下适合他的效率就高

Top

11楼  jyk   (喜欢编程。和气生财。共同提高。共同进步)

 回复于 2006-03-15 19:53:57  得分 0
http://blog.52forum.com/jyk/archive/2006/03/15/344.html  
   
  这里有测试图表。  
   
  性能差很多的。只不过我还没有发现有几百倍的差距。  
   
  我觉得应该研究一下。

Top

12楼  wuqing5220   (三水青)

 回复于 2006-03-15 19:56:55  得分 1

DataSet   生成   数据集?   来测试下效率怎么样?

Top

13楼  jyk   (喜欢编程。和气生财。共同提高。共同进步)

 回复于 2006-03-15 20:05:26  得分 0

DataSet   和   DataTable   在绑定控件的时候都是一样的。都使用的是   DataTableDefaultView   ,好像不是叫这个名,其实都是用的   DataView来绑定控件的。  
   
  不过我都是测试了一下   DataReader   和   dataTable的差别。  
   
  响应人数来说,基本没有什么差别,只是   DataReader   会让   asp.net   少占一点内存,但是代价是长时间的占用数据库连接。  
   
  因为绑定控件是很占用cpu的,在测试   显示349条记录的时候,asp.net占用了   90%以上的CPU   ,而   SQL   几乎不占用CPU。  
   
  如果这是您是使用     DataReader   绑定控件,您想象是什么结果呢?占用数据库连接,但是又没做什么。

Top

14楼  nameone   (萨达姆)

 回复于 2006-03-15 20:12:38  得分 1

UP

Top

15楼  fstars   (天天)

 回复于 2006-03-15 21:24:34  得分 1

mark..

Top

16楼  pwqzc   (吴旗娃徒也~~老鼠粮仓之路)

 回复于 2006-03-16 08:09:30  得分 9

很好的东西,顶JYK下

Top

17楼  zmacro   (zmacro)

 回复于 2006-03-16 08:22:59  得分 0

up

Top

18楼  zorou_fatal   (The world and system is even)

 回复于 2006-03-16 08:32:31  得分 2

路过,帮顶

Top

19楼  jyk   (喜欢编程。和气生财。共同提高。共同进步)

 回复于 2006-03-16 08:34:22  得分 0

多谢各位。  
   
 

Top

20楼  fellowcheng   (浮云一小朵)

 回复于 2006-03-16 08:42:47  得分 1

学习下

Top

21楼  wd_terry   (IQ+EQ=QQ)

 回复于 2006-03-16 09:01:58  得分 1

ACT还没用过呐,学习!~~

Top

22楼  flyingsnowy   (等到我变成星星我就转.Net了(欧杨飘雪))

 回复于 2006-03-16 09:13:03  得分 1

DataGrid提供了最多的功能,如允许访问者对记录编辑、排序或分页。同时它也是  
          最容易使用的,甚至于简单到只需要将之添加到页面中而不必额外编写代码。不过  
          这些易用性是以性能的损失为代价的。DataGrid在三种控件中是效率最低的,特别  
          是在使用Web   Form的情况下。  
   
    通过使用模板,DataList提供了比DataGrid更加优秀的界面效果。不过这需要以牺  
          牲一定的开发时间为代价。为了添加排序、分页和编辑功能,程序员不得不花费比  
          使用DataGrid更多的精力来进行编码,虽然它的性能要优于DataGrid。  
   
    最后,Repeater允许对数据记录作最大限度的HTML定制。通常,使用Repeater来显  
          示数据记录比使用DataGrid和DataList要耗费更长的开发时间。另外,它不支持内  
          建的编辑、排序和分页功能。所幸的是,Repeater在性能上要优于其它两种控件,  
          特别是明显优于DataGrid。  
 

Top

23楼  wd_terry   (IQ+EQ=QQ)

 回复于 2006-03-16 09:17:23  得分 1

楼上在抄书吧,这里在讨论实际测试效果呐  
   
   
  **********************************************  
  另外,JYK,在ACT中怎么添加一个测试,使其只测试自己机子上的某一个特定网站呢?

Top

24楼  zkxp   (堕落的卖猪贩)

 回复于 2006-03-16 09:22:50  得分 1

 
  有没有试过自己写的控件或方法绑定来比较测试呢。这样效率应该更高吧。

Top

25楼  flyingsnowy   (等到我变成星星我就转.Net了(欧杨飘雪))

 回复于 2006-03-16 09:28:03  得分 1

Repeater类不是继承自WebControl类的,这一点与DataGrid和DataList不同。  
          Repeater唯一优于DataGrid和DataList的特点是它的性能,尤其明显优于DataGrid

Top

26楼  dolfen   (海之豚(每天进步一点点))

 回复于 2006-03-16 10:08:58  得分 1

关注。。。

Top

27楼  job_2006   (初学.net)

 回复于 2006-03-16 10:43:07  得分 1

顶顶

Top

28楼  mmqingfeng   (漠漠青峰)

 回复于 2006-03-16 11:35:33  得分 1

在数据绑定的时候我通常喜欢先建些与数据表对应的辅助类,比如:  
   
      class   CityInfo  
      {  
          public   int   CityID;  
          public   int   ProvinceID;  
          public   string   City;  
          public   int   AeraCode;  
      }  
   
  用SQL控制分页,用DataReader读数据到   CityInfo[]   或者ArrayList里,然后再帮定  
  绑定的时候直接写<%#   Container.DataItem.CityID   %>  
   
  楼主帮忙测一下效率吧~~  
   
  P.S   有ACT的快速参考么,我懒得翻MSDN慢慢查了   :)

Top

29楼  mmqingfeng   (漠漠青峰)

 回复于 2006-03-16 11:46:08  得分 1

刚才的绑定是vb的,  
  C#里是这样  
  <%#   ((CityInfo)Container.DataItem).CityID%>

Top

30楼  Gerryjiang   (下一站)

 回复于 2006-03-16 14:00:29  得分 1

I.<%#   DataBinder.Eval(Container,   "DataItem.AeraCode")%>  
  这种绑定的确速度会慢一点,  
   
  3、Repeater   :   <%#   ((DataRowView)Container.DataItem)["CityID"]   %>   方法   :   250   rps     多一点点。  
   
  4、Repeater   :   <%#   ((DataRowView)Container.DataItem)[0]   %>   方法   :   250   rps     多一点点。  
   
  3,4不能算是两种方法,ASP.NET的优化里面有一条就是要注意绑定数据的方法  
   
  II.但就是这样的话也不能体现出repeater   比datagrid   快在哪里,只能说是速度相差不大,  
      我也正在做一个测试,当绑定的数据加大时各自的影响

Top

31楼  jyk   (喜欢编程。和气生财。共同提高。共同进步)

 回复于 2006-03-16 16:03:02  得分 0

我一开始是感觉   repeater     比datagrid     快。  
   
  但是测试之后呢却发现   datagrid   要比   repeater   还快!     很大的差距。  
   
  =========  
   
  >>Repeater唯一优于DataGrid和DataList的特点是它的性能,尤其明显优于DataGrid  
   
  这句话从何而出呢?是怎么得出的结论呢?  
   
 

Top

32楼  jyk   (喜欢编程。和气生财。共同提高。共同进步)

 回复于 2006-03-16 20:32:41  得分 0

up

Top

33楼  charles_y   (每天上网一小时)

 回复于 2006-03-16 20:41:36  得分 1

不错的测试,其实DataGrid一般情况下性能够了

Top

34楼  jyk   (喜欢编程。和气生财。共同提高。共同进步)

 回复于 2006-03-17 12:17:41  得分 0

就是呀,不测试真的不知道呀。  
   
 

Top

35楼  bccu   (风雨中人)

 回复于 2006-03-17 13:50:42  得分 1

学习。!

Top

36楼  longhorn008   (菜鸟.net)

 回复于 2006-03-18 23:58:10  得分 1

study  
  to   :   mmqingfeng(漠漠青峰)    
  这样开销是不是有点大,或者说用struct能省点?

Top

37楼  jyk   (喜欢编程。和气生财。共同提高。共同进步)

 回复于 2006-03-31 15:13:05  得分 0

up

Top

38楼  cyy1981   (McRain)

 回复于 2006-03-31 15:33:14  得分 1

学习

Top

39楼  vivi8233   (吐司)

 回复于 2006-03-31 15:58:30  得分 1

学习了!!

Top

40楼  dingsongtao   (一翁傾塵『舍得』)

 回复于 2006-03-31 16:18:10  得分 1

学习!  
  不过我还是觉得DataGrid的效率要高点!  
  至少它的数据处理机制没那么复杂!

Top

41楼  longli67   (海天)

 回复于 2006-03-31 16:30:49  得分 1

DataGrid的功能大,但速度偏慢!  
  Repeater功能较少,但速度比DataGrid要快!  
  看具体使用了!

Top

42楼  jyk   (喜欢编程。和气生财。共同提高。共同进步)

 回复于 2006-04-05 13:01:22  得分 0

>>Repeater功能较少,但速度比DataGrid要快!  
   
  请拿出证据!拿出快的证据。

Top

43楼  topso   (小刀)

 回复于 2006-04-05 14:10:51  得分 2

<%#   ((CityInfo)Container.DataItem).CityID%>  
  不错,我去改我的程序,谢谢

Top

44楼  underwater   (Never be afraid of bricks)

 回复于 2006-04-05 14:28:11  得分 2

1、建议楼主测试和学习全面了再做言语如此肯定的报告  
  2、建议楼主不要拿<%#   DataBinder.Eval(Container,   "DataItem.AeraCode")%>、<%#   ((CityInfo)Container.DataItem).CityID%>之类用于Repeater后来和DataGrid比较  
  3、建议楼主拿十万级以上的数据量测试  
  4、建议楼主先理解Repeater和DataGrid各自的显著优缺点

Top

45楼  lizheng__114   (浪淘沙)

 回复于 2006-04-05 15:00:20  得分 2

mark

Top

46楼  caobob   (我sick了,I很weak,我feeling特bad!)

 回复于 2006-04-05 15:25:20  得分 2

你把viewstate关了还有意义吗?一个不能排序和分页的DataGrid和repeater,我觉得他们内在基本也就一样了.

Top

47楼  caobob   (我sick了,I很weak,我feeling特bad!)

 回复于 2006-04-05 15:27:00  得分 2

还有关于这两个控件所继承于不同的基类也应该好好研究下.那么自然就能得出效率的问题了.

Top

48楼  webwait   (webwei)

 回复于 2006-04-05 15:49:53  得分 2

学习

Top

49楼  jieguo   (天下有眼)

 回复于 2006-04-05 16:00:23  得分 2

顶一下underwater(Never   be   afraid   of   bricks),  
  搂主用大数据量测一下,DataGrid慢死了

Top

50楼  ljq688   ()

 回复于 2006-04-05 16:23:01  得分 2

关注下,前辈都是用Repeater的,所以我也比较倾向于这个

Top

51楼  Ivony   ()

 回复于 2006-04-05 16:34:55  得分 2

楼主进行了不公平的测试!  
   
  问题的确就出在DataBinder.Eval方法上。  
   
  要知道,DataGrid自动创建列的时候,可不是用DataBinder.Eval的。  
  DataGrid的数据源如果是DataSet或者DataTable,  
  则DataGrid会自动找所绑定的DataTable的DefaultView,也就是DataView对象。  
  DataView实现了接口:ITypedList  
  实现了这个接口的DataView可以告诉DataGrid他的架构信息,也就是他有多少列,每一列叫什么名字,甚至可以取出每一列强类型的值。  
   
  而Repeater的DataBinder.Eval方法竟然会找出DataTable所有的属性,然后再找找看有没有索引器,有索引器,再尝试反射调用索引器的get方法……如此繁琐的反射步骤,怎么会不慢?  
   
   
  如果你的DataGrid也使用DataBinder,我想绝对不会比Repeater快。  
  而Repeater如果使用强类型绑定  
  ((DataRowView)   Container.DataItem)["Name"]  
  也不应该会比DataGrid慢……  
   
  DataBinder.Eval只是能够给我们简化代码,并且是数据绑定表达式适应任何数据源的,在效率上,它可是非常差劲的。

Top

52楼  chenhaoying   (风雨无阻)

 回复于 2006-04-05 16:45:19  得分 2

书上说哪个好我也就说哪个好了,谁有空拿海量的数据来做压力测试啊。  
  不过我特支持楼主的挑战权威的精神。

Top

53楼  lesen   (如风)

 回复于 2006-04-05 16:58:34  得分 2

如果是用   SqlDataReader   绑定数据的话,那也没办法   ((DataRowView)   Container.DataItem)["Name"]

Top

54楼  zhouheng123456   (授之以鱼,不如授之以渔)

 回复于 2006-04-05 17:02:03  得分 2

书上说哪个好我也就说哪个好了,谁有空拿海量的数据来做压力测试啊。  
  不过我特支持楼主的挑战权威的精神。  
   
   
  用到的时候在去测.

Top

55楼  zhongkeruanjian   (编程亮子)

 回复于 2006-04-05 17:03:41  得分 2

哈哈,LZ郁闷了,Repeater得用直接取字段值得方法。而不是用DataBinder.Eval,用DataBinder.Eval的话那也太亏了啊,哈,不过楼主的精神还是值得佩服的!

Top

56楼  Ivony   ()

 回复于 2006-04-05 17:10:17  得分 2

如果是用   SqlDataReader   绑定数据的话,那也没办法   ((DataRowView)   Container.DataItem)["Name"]  
   
   
  ((IDataReader)   Container.DataItem)["Name"]

Top

57楼  lesen   (如风)

 回复于 2006-04-05 17:15:25  得分 2

你可以测试一下,如果是用   SqlDataReader   绑定数据的话,还是有问题:  
   
  ((IDataReader)   Container.DataItem)["Name"]  
 

Top

58楼  iuhxq   (小灰)

 回复于 2006-04-05 17:15:53  得分 2

敢于挑战权威,有勇气,佩服.  
   
  虽然我没测试过,我还是觉得Repeater效率高,因为理论上是这样的.做的事情越少,效率月高,除非像BT下载,越多越快

Top

59楼  underwater   (Never be afraid of bricks)

 回复于 2006-04-05 17:17:31  得分 2

 
  你可以测试一下,如果是用   SqlDataReader   绑定数据的话,还是有问题:  
   
  ((IDataReader)   Container.DataItem)["Name"]  
  --------------------------------------------------  
   
  IDataReader需要保持数据库连接来读取数据,在ASPX的代码中用   ((IDataReader)   Container.DataItem)["Name"]   这样的方法来做时,关闭连接是在读取数据步骤之前的,除非你不关闭。

Top

60楼  roydu   (北京寻找asp.net工作中,有意者联系 djy365@hotmail.com或Q119020818)

 回复于 2006-04-05 17:20:59  得分 2

-----------------------------------------  
   
   
   
   
  潜力帖!!!!  
   
   
   
   
   
  vs2005里是不是没这个功能了?  
   
   
   
   
  --------------------------------------------------------

Top

61楼  webwait   (webwei)

 回复于 2006-04-05 17:22:35  得分 2

学习

Top

62楼  Ivony   ()

 回复于 2006-04-05 17:26:08  得分 2

你可以测试一下,如果是用   SqlDataReader   绑定数据的话,还是有问题:  
   
  ((IDataReader)   Container.DataItem)["Name"]  
   
  出现什么问题?  
   
   
   
  DaraBind期间不能关闭DataReader,  
  Repeater会把DataReader当作一个IEnumerable来绑定。  
   
  刚刚反射了.NET的源代码查看,你这样绑定应该就没问题了:  
   
  ((IDataRecord)   Container.DataItem)["Name"]  
   
   
  其实,写一句Container.DataItem.GetType().ToString()就能知道它的类型了。  
   
  我没想到在DataReader的Enumerator里面还对值进行了一次拷贝……

Top

63楼  lesen   (如风)

 回复于 2006-04-05 17:29:25  得分 2

对了,楼主你的   DataGrid   的代码是怎么写的,贴出来,这样对比才清楚。是不是也用   DataBinder.Eval()

Top

64楼  xiahouwen   (武眉博<活靶子.NET>)

 回复于 2006-04-05 17:40:03  得分 2

原因是你采用了DataBinder.Eval   ...  
  你给DG也这样试试

Top

65楼  oxfordxyc   (石头)

 回复于 2006-04-05 17:41:53  得分 2

萝卜白菜,各有所爱!

Top

66楼  dapanda   (一天)

 回复于 2006-04-05 17:46:41  得分 2

再也不用repeater了,自找苦吃,

Top

67楼  songxiaozhao   (雨朋)

 回复于 2006-04-05 17:47:14  得分 2

Repeater   快,好用

Top

68楼  zl9732   (zl9732)

 回复于 2006-04-05 17:57:13  得分 2



Top

69楼  lcddjyy   (鲁哆哆)

 回复于 2006-04-05 18:23:35  得分 2

DataReadear比DataSet快15%   SqlDataReader比OleDbDataReader快50%   用DataReader的ASP风格的表格显示比DataGrid绑定DataReader快60%   用Ordinal的DataReader访问字段比用名字访问快15%   DataGrid中用AutoGenerateColumns=true比用显式绑定快24%   尽量用缓存   以上是INETA牛人Stephen   Walther的比较测试结论.希望对大家有用

Top

70楼  cat_hsfz   (我的Blog在http://purl.oclc.org/NET/cathsfz)

 回复于 2006-04-05 22:29:01  得分 2

如果楼主的DataGrid不是用Template加<%#   %>来绑数据,那就真没有可比性咯。  
   
  如果双方都是Template,然后都是要靠从DataItem里面取值,那么Repeater的效率没可能低的。Repeater的Templater 是当作内联HTML处理的,无须创建控件,直接把<%#   %>的结果作为HTML内联进去就可以了。但DataGrid的Template则不同,一个Table到Row再到Cell,层层创建控件的效率 其实是十分低的,然后再把<%#   %>的值绑定到Cell控件的属性上面去,这也是损失效率的。

Top

71楼  ld_thinking   (懒得想)

 回复于 2006-04-05 22:55:22  得分 2

如果直接用的     Ilist做DataSource呢??!!!

Top

72楼  Ivony   ()

 回复于 2006-04-06 09:17:57  得分 2

如果直接用的     Ilist做DataSource呢??!!!  
   
   
  如果直接用IList做DataSource,则DataGrid的自动创建列也不可用,必须数据绑定,也能够比较出Repeater更快……。

Top

73楼  ld_thinking   (懒得想)

 回复于 2006-04-06 10:25:33  得分 2

是指Nhibernate返回的Ilist     集合作为Repeater的   DataSource  
   
  试了下   这样绑定确实快了点点   300   条记录     没开启分页          
  <td><%#((Entity.User)Container.DataItem).UserName%>

Top

74楼  ld_thinking   (懒得想)

 回复于 2006-04-06 10:26:31  得分 2

又学会     一招         :))))))))))

Top

75楼  yz_hurrah   (韧)

 回复于 2006-04-06 10:39:55  得分 2

请问楼上:如果返回一个IList,类似<%#   %>这样的绑定,用什么格式才更有效率一些?好比DataView的<%#   ((DataRowView)Container.DataItem)[""]%>这样的格式就更有效率一些。

Top

76楼  yz_hurrah   (韧)

 回复于 2006-04-06 10:46:08  得分 2

ld_thinking(懒得想)的方法不错,我试了,可行,不过得加<%@   Import   namespace="Entity"%>。

Top

77楼  Ivony   ()

 回复于 2006-04-06 11:35:52  得分 2

ld_thinking(懒得想)的方法不错,我试了,可行,不过得加<%@   Import   namespace="Entity"%>。  
   
  强类型转换是效率最高的数据绑定方法,唯一的不好就是写起来麻烦,还有,缺少灵活性,更改数据源类型就可能要修改数据绑定表达式。

Top

78楼  aliketen   (继续学习NET!)

 回复于 2006-04-06 12:10:17  得分 2

学习

Top

79楼  yz_hurrah   (韧)

 回复于 2006-04-06 13:07:58  得分 2

Ivony()   :所以鱼和熊掌不可兼得呀,哈。

Top

80楼  Ivony   ()

 回复于 2006-04-06 13:29:41  得分 2

是的……  
  所以我也弄过兼顾灵活性和效率的一个方法,就是让数据自己实现绑定。  
   
  我首先建立了ORM模型,让我的数据全都是强类型的。  
  然后,定义一个接口:  
   
  public   interface   IDataBinable  
  {  
      string   Eval(   string   name,   string   format   );  
  }  
   
  让我的所有的数据类都实现这个接口。  
  又写了一些帮助实现这个接口的方法,和利用这个接口实现数据绑定的方法。  
   
  这样,就使得鱼和熊掌兼顾了。可是,兼顾了效率和灵活性的同时,又增加了代码……不过我觉得还是值得的。  
   
   
   
  微软也是在效率和灵活性中作了很多的取舍。

Top

81楼  ld_thinking   (懒得想)

 回复于 2006-04-06 13:36:05  得分 2

public   interface   IDataBinable  
  {  
      string   Eval(   string   name,   string   format   );  
  }  
   
  关心你这个具体实现?     还是用了反射吗?

Top

82楼  Ivony   ()

 回复于 2006-04-06 13:43:50  得分 2

当然不是,用代码生成器生成的代码……  
   
  也有的地方是数据类自己保存了DataRow,直接映射……  
   
  类似于这样:  
   
  public   Eval(   string   name,   string   format   )  
  {  
      switch(   name   )  
      {  
          case   "Name":  
              return   FormatUtility.FormatObject(   this.Name,   format   );  
          case   ...  
              ...  
          default:  
              retrun   null;  
      }  
  }  
   
  或者:  
   
  public   Eval(   string   name,   string   format   )  
  {  
      return   FormatUtility.FormatObject(   this[name],   format   );  
  }  
   
   
  public   Eval(   string   name,   string   format   )  
  {  
      return   FormatUtility.FormatObject(   _dataRow[name],   format   );  
  }  
   
   
   
  附FormatObject的简单实现:  
          public   static   string   FormatObject(   object   obj,   string   formatstring   )  
          {  
              if   (   obj   ==   null   )  
                  throw   new   ArgumentNullException(   "obj"   );  
   
   
              IFormattable   formattable   =   obj   as   IFormattable;  
              string   resault;  
              if   (   formattable   !=   null   )  
                  return   formattable.ToString(   formatstring,   null   );  
              else  
                  return   obj.ToString();  
   
          }  
 

Top

83楼  Ivony   ()

 回复于 2006-04-06 13:45:41  得分 2

因为我的体系还没做好,所以就不拿出来见笑了,我只是说一个思路,一种做法而已。  
   
  我的另外一个东东,数据库帮助器,正在共享……  
   
  http://community.csdn.net/Expert/topic/4583/4583043.xml?temp=.3034632
Top

84楼  jyk   (喜欢编程。和气生财。共同提高。共同进步)

 回复于 2006-04-09 15:55:13  得分 0

这几天比较忙,没来看回帖,呵呵,这么多的回贴了,兴奋中!  
   
  >>测试目的:网站的页面里面显示数据的效率。只测试显示数据的功能,不管其他的方面。  
   
  这里已经写了我的测试目的,我并不想全面比较   两个控件的   各个方面的优缺点,我只想测试一下一个特殊范围内两个控件的效率   ——   在网页里显示数据,比如显示一个新闻列表。  
   
  就拿显示新闻列表来说吧。  
   
  1、显示新闻,谁都不会一下子把所有的新闻都列出来吧,一页也就显示20条、30条。那么就和数据得总记录数没有关系了,所以也不要让我测试什么海量数据了。  
   
  2、我绑定控件是不用   DataReader   的,都是用DataTable   来绑定的。  
   
  3、你在使用   Repeater   的时候   用的什么方法呢?<%#   DataBinder.Eval(Container,   "DataItem.CityID")%>   还是什么?反正我是一直在用   <%#   DataBinder.Eval(Container,   "DataItem.CityID")%>。现在才发现   <%#   DataBinder.Eval(Container,   "DataItem.CityID")%>   是多么的慢。  
   
  那些号称   Repeater   快的文章里可是没有说过不要用   <%#   DataBinder.Eval(Container,   "DataItem.CityID")%>   来显示数据的呀。  
   
  4、不知道还有多少人再用   <%#   DataBinder.Eval(Container,   "DataItem.CityID")%>     。  
  发这个帖子,是想给大家提个醒。  
   
 

Top

85楼  yecong   (野丛网)

 回复于 2006-04-09 17:04:08  得分 2

DataBinder.Eval()是用反射来获取数据,比较慢。  
   
  佩服楼主,这样的问题也琢磨。再差能差多少

Top

86楼  shine_88   ()

 回复于 2006-04-09 19:18:01  得分 2

ms自己的说法应该没有错吧,不知道问题在那里!

Top

87楼  wangjuping   (三皮子[www.3pz.com])

 回复于 2006-04-09 19:25:26  得分 2

哇,学到的东西真不少。  
   
  其实,我有个更简单的办法,去问VS的工程师不就明白了?

Top

88楼  jyk   (喜欢编程。和气生财。共同提高。共同进步)

 回复于 2006-04-09 20:34:28  得分 0

>>>再差能差多少  
   
  呵呵,差很多呢!尤其是做一个网站,尤其是一个访问量很高的网站。

Top

89楼  zorou_fatal   (The world and system is even)

 回复于 2006-04-10 02:14:06  得分 2

是的,于小处见学问

Top

90楼  jyk   (喜欢编程。和气生财。共同提高。共同进步)

 回复于 2006-04-10 10:38:18  得分 0

upup

Top

91楼  vabug   (边缘)

 回复于 2006-04-10 10:45:15  得分 2

我也来测试一下,搞定后提交结果!

Top

92楼  vabug   (边缘)

 回复于 2006-04-10 13:08:33  得分 2

硬件:cpu:intel   2.8G   、120G硬盘、768M内存。  
  软件:windows   2003   +   sp1   、Vs2003   、SQL   Server   2000   +   sp4  
   
  测试数据:显示一张表数据,1个字段,350条记录。  
   
  测试结果   页面都关闭ViewState  
                    DataGrid           Repeater  
  请求总数:   8,163   5,126    
  连接总数:   8,162   5,125    
       
  每秒平均请求数:   68.03   42.72    
  首字节平均响应时间(毫秒):   9.78   18.28    
  末字节平均响应时间(毫秒):   9.86   18.42    
  每次迭代末字节平均响应时间(毫秒):   9.86   18.42    
 

Top

93楼  vabug   (边缘)

 回复于 2006-04-10 13:09:27  得分 2

看起来,还是DataGrid好些!!

Top

94楼  jyk   (喜欢编程。和气生财。共同提高。共同进步)

 回复于 2006-04-10 13:19:40  得分 0

你的   Repeater   用的是哪种方法呀  
   
  <%#   DataBinder.Eval(Container,   "DataItem.CityID")%>  
   
  还是  
   
  <%#   ((DataRowView)Container.DataItem)["CityID"]   %>  
   
 

Top

95楼  Truly   ()

 回复于 2006-04-10 13:45:21  得分 2

呵呵,没有仔细看你的测试方法,但是关于Repeater   &   DataGrid   的效率或者说哪个更好跟实际使用者和使用方法等都有关系的,所以你的结论不能说明什么问题。  
   
  Repeater相对DataGrid是一种轻量级的容器,有更小的资源占用,更灵活的使用。  
   
  而DataGrid则可以比较简便的实现很多负责功能比如分页等。关于两者的比较,可以从两方面入手,一是阅读比较两者的实现代码,二是对自己的代码分别进行测试,这种得出的结果比较客观,但是存在使用者代码是否合理的因素  
   
  最后DataBinder.Eval是一种利用反射机理的方法,效率比较低下。追求性能的话可以考虑使用Typed   DataSet,当然还有很多其他的策略。    
   
  http://truly.cnblogs.com/archive/2005/08/06/208990.aspx
Top

96楼  blackmailer   ()

 回复于 2006-04-10 13:49:17  得分 2

楼主精神可嘉呀,学习中!

Top

97楼  vabug   (边缘)

 回复于 2006-04-11 17:16:00  得分 2

用的  
  <%#   DataBinder.Eval(Container,   "DataItem.CityID")%>  
  这种方法

Top

98楼  cat_hsfz   (我的Blog在http://purl.oclc.org/NET/cathsfz)

 回复于 2006-04-11 19:06:01  得分 2

插嘴再提一个测试建议,如果是ASP.NET   2.0用GridView来自动绑一个ObjectDataSource提供的List<>效率如何,ObjectDataSource能够 拥有SqlDataSource那样的效率吗?List<>也是强类型的哦,而且也有ObjectDataSourceView。

Top

99楼  Ivony   ()

 回复于 2006-04-11 20:25:34  得分 2

关键是是不是实现了ITypedList,与是不是强类型没关系……

Top

100楼  jyk   (喜欢编程。和气生财。共同提高。共同进步)

 回复于 2006-04-14 13:18:10  得分 0

<%#   DataBinder.Eval(Container,   "DataItem.CityID")%>   效率确实很低,  
   
  问题是:这种方法是vs默认提供的,也可以说是一个陷阱。  
   
   
  还没有使用   2.0。故没有条件测试。  
   
 

Top

101楼  Radar2006   (中华英雄)

 回复于 2006-04-27 17:24:34  得分 2

学习……

Top

102楼  xxqq0824   (赛跑)

 回复于 2006-04-27 23:53:18  得分 2

mark,期待更多人加入讨论

Top

103楼  Climb_Tree   (爬树)

 回复于 2006-04-28 01:17:36  得分 2

我顶

Top

104楼  threemonths   ()

 回复于 2006-04-28 01:47:53  得分 2

学习

Top

105楼  jellyeileen   ()

 回复于 2006-04-28 08:27:14  得分 2

关注^  
  虽然我没有测试

Top

106楼  axinghe   (星河)

 回复于 2006-04-28 09:01:01  得分 2

个人感觉Repeater比DataGrid好用。

Top

107楼  greatbag   (快乐就是没有什么不快乐)

 回复于 2006-04-28 12:57:03  得分 2

插嘴再提一个测试建议,如果是ASP.NET   2.0用GridView来自动绑一个ObjectDataSource提供的List<>效率如何,ObjectDataSource能够 拥有SqlDataSource那样的效率吗?List<>也是强类型的哦,而且也有ObjectDataSourceView。  
   
   
  =================================================================  
  直接将Ilist<>做为数据源就好了,再加上ObjectDataSource感觉就像是脱了裤子放屁,实验结果将马上推出

Top

108楼  greatbag   (快乐就是没有什么不快乐)

 回复于 2006-04-28 13:28:33  得分 2

1   的绑定方式为((BookInfo)(Container.DataItem)).BookId     2   为Eval  
    请求总数:   31,813   31,086  
    连接总数:   31,812   31,086  
       
    每秒平均请求数:   106.04   103.62  
    首字节平均响应时间(毫秒):   6.21   6.50  
    末字节平均响应时间(毫秒):   6.66   6.91  
    每次迭代末字节平均响应时间(毫秒):   26.63   27.62  
  因为数据只有将近20条,且不同列只有2列,所以看起来差别比较小,不过还是可以看出eval的性能比不上强类型绑定

Top

109楼  loveWife   (我爱红)

 回复于 2006-04-28 14:23:38  得分 2

学习

Top

110楼  fxqyyzg   (海冬青|飞的更高)

 回复于 2006-04-28 14:36:13  得分 2

学习中

Top

111楼  jyk   (喜欢编程。和气生财。共同提高。共同进步)

 回复于 2006-05-19 18:36:51  得分 0

up呀

Top

112楼  hanguoji84   (hanguoji)

 回复于 2006-05-19 18:52:32  得分 2

大家都喜欢要证据:  
  Repeater   其中没有   DataGrid   中自身配置的很多处理类     比如   分页以及很多的属性或功能,就加载速度来说Repeater   要比   DataGrid   快些,因为Repeater   加载的自己用的类或继承的东西较少很多很多,后期邦定的方式可能会影响对Repeater   的测试,因为后期邦定本身就是一个速度较慢的方式。  
  DataGrid   的好处在于功能全面。  
  Repeater   的好处在于对响应速度快,对页面美工设计要比DataGrid   方便的多,但在使用上功能要欠缺,比如分页方面还会继承DataGrid   继承的类  
   
  说的不知道对不对。

Top

113楼  mendel   (风逍遥)

 回复于 2006-05-19 18:59:35  得分 2

请问((DataRowView)Container.DataItem)中的DataRowView是什么?

Top

114楼  ilovejolly   (有些伤感)

 回复于 2006-05-19 19:06:27  得分 2

怀疑

Top

115楼  cat_hsfz   (我的Blog在http://purl.oclc.org/NET/cathsfz)

 回复于 2006-05-19 21:25:56  得分 2

直接将Ilist<>做为数据源就好了,再加上ObjectDataSource感觉就像是脱了裤子放屁,实验结果将马上推出  
   
  ---  
  直接用List<>作为DataSource好像不支持自动分页,很奇怪。我指定List<>为数据源然后AllowPaging="true"之后就会提示PageChanging没有绑定。

Top

116楼  shw586   (老枪)

 回复于 2006-05-19 23:07:31  得分 2

记得不知是03年还是04年的《程序员》中就有这方面的比较,原文记不大清楚了,等着我翻故纸堆去也

Top

117楼  shw586   (老枪)

 回复于 2006-05-19 23:08:45  得分 2

搞错了,原文比较的是DataReader和DataSet,审题不清,惭愧惭愧

Top

118楼  minermy   ()

 回复于 2006-05-20 00:57:53  得分 2

一般情况下,我是哪一种使用方便时就使用哪一种,无需考虑细微性能差别,当然,数据量和访问量大有作别论。  
  不过这次也获益匪浅,谢楼主。

Top

119楼  husttc   (草原狼)

 回复于 2006-05-20 10:57:03  得分 2

MARK!

Top

120楼  jyk   (喜欢编程。和气生财。共同提高。共同进步)

 回复于 2006-05-20 13:11:37  得分 0

to:hanguoji84(hanguoji)    
   
  就算你说的都对,那么你也承认了   Repeater   有一个地方是很慢的,就是这一个慢的地方,把前面快的地方都给“拖累”慢了;你也承认会影响测试效果,这就可以了。  
   
  另外你前面说的那些快的地方有证据吗?还是说都是你的感觉?  
   
   
  to:mendel(风逍遥)    
   
  (DataRowView)是强制转换,类似于   (DataRow)。  
 

Top

121楼  mendel   (风逍遥)

 回复于 2006-05-20 13:34:25  得分 2

<%#   ((DataRowView)Container.DataItem)["fdTitle"]   %>  
   
  我这样写出错了:  
  编译错误    
  说明:   在编译向该请求提供服务所需资源的过程中出现错误。请检查下列特定错误详细信息并适当地修改源代码。    
   
  编译器错误信息:   CS0246:   找不到类型或命名空间名称“DataRowView”(是否缺少   using   指令或程序集引用?)  
   
  源错误:  
   
     
   
  行   92:                                           <asp:Repeater   ID="rptVote"   runat="server">  
  行   93:                                                   <ItemTemplate>  
  行   94:                                                   <strong><%#   ((DataRowView)Container.DataItem)["fdTitle"]   %></strong><br   />  
   
     
  请问是怎么回事啊?谢谢

Top

122楼  cybonline   (求败)

 回复于 2006-05-20 13:49:32  得分 2

用Container.dataitem("字段")帮顶的效率高些

Top

123楼  lnwuyaowei   (风可以追我)

 回复于 2006-05-20 15:40:31  得分 2

学习.

Top

124楼  greatbag   (快乐就是没有什么不快乐)

 回复于 2006-05-23 09:17:43  得分 2

直接用List<>作为DataSource好像不支持自动分页,很奇怪。我指定List<>为数据源然后AllowPaging="true"之后就会提示PageChanging没有绑定。  
  ---  
  需要重写分页功能  
   
  并不提倡使用自动分页,每次都会将所有数据都读出来再分頁

Top

125楼  mendel   (风逍遥)

 回复于 2006-05-24 09:03:53  得分 2

<%#   ((DataRowView)Container.DataItem)["fdTitle"]   %>  
   
  我这样写出错了:  
  编译错误    
  说明:   在编译向该请求提供服务所需资源的过程中出现错误。请检查下列特定错误详细信息并适当地修改源代码。    
   
  编译器错误信息:   CS0246:   找不到类型或命名空间名称“DataRowView”(是否缺少   using   指令或程序集引用?)  
   
  源错误:  
   
     
   
  行   92:                                           <asp:Repeater   ID="rptVote"   runat="server">  
  行   93:                                                   <ItemTemplate>  
  行   94:                                                   <strong><%#   ((DataRowView)Container.DataItem)["fdTitle"]   %></strong><br   />  
   
     
  请问是怎么回事啊?谢谢  
 

Top

126楼  HJ_34   (刺桐游子)

 回复于 2006-05-24 09:19:06  得分 2

少量显示可能DATAGRID跟REPEATER差不多.  
  但在大量数据显示上,REPEATER要快得多,网上就有关于这方面的测试报告.  
  同时,REPEATER的代码也要简捷得多.

Top

127楼  xyunsh   (学海无涯,回头是岸)

 回复于 2006-05-24 09:20:37  得分 2

mark

Top

128楼  alby   (女人不是一团有缝的肉!)

 回复于 2006-05-24 09:40:25  得分 2

Repeater   效率应该要高些

Top

129楼  liujiayu10   (活着就好)

 回复于 2006-05-24 09:48:04  得分 2

功能少的快些!这是真理!

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐