CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  ASP.NET

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

楼主jyk(今天由我来写的代码,明天就让程序自己完成!喜欢编程。和气生财。共同提高。共同进步!)2006-03-15 18:53:36 在 .NET技术 / ASP.NET 提问

我以往的人像是: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、回复次数:129Top

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://cathsfz.cnblogs.com)回复于 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

UPTop

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

upTop

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((欧杨)不远万里来看楼主的帖,这是一种什么样的精神病?)回复于 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((欧杨)不远万里来看楼主的帖,这是一种什么样的精神病?)回复于 2006-03-16 09:28:03 得分 1

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

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

upTop

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

upTop

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(yaomv)回复于 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

markTop

46 楼caobob(我是虾米儿的fans,她的笑容很熟悉。)回复于 2006-04-05 15:25:20 得分 2

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

47 楼caobob(我是虾米儿的fans,她的笑容很熟悉。)回复于 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(水源倒爷)回复于 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://cathsfz.cnblogs.com)回复于 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=.3034632Top

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

upupTop

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.aspxTop

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://cathsfz.cnblogs.com)回复于 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(climbTree@msn.com)回复于 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(http://www.hibooker.cn)回复于 2006-04-28 12:57:03 得分 2

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

108 楼greatbag(http://www.hibooker.cn)回复于 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(北飘)回复于 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://cathsfz.cnblogs.com)回复于 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(http://www.hibooker.cn)回复于 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

markTop

128 楼alby(批发各种型号黄瓜)回复于 2006-05-24 09:40:25 得分 2

Repeater   效率应该要高些Top

129 楼liujiayu10(活着就好)回复于 2006-05-24 09:48:04 得分 2

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

相关问题

  • 讨论:datagrid、datalist、Repeater相互嵌套的效率问题(100分)
  • 讨论:datagrid、datalist、Repeater相互嵌套的效率问题(100分)
  • 再问一遍:DataGrid分页效率问题?
  • 两种DATAGRID分页方法,哪种效率高?
  • Winform下datagrid数据倒入excel的效率问题
  • 用DataGrid分页的效率到底高吗?
  • 关于DataGrid,DataSet和效率的一些问题!
  • ArrayList 和 datatable 作datagrid数据源,那个效率高和占资源少?
  • 请问我是自己写存储过程实现分页的效率高,还是用DataGrid自身的分页功能效率高?
  • 单纯使用datagrid的分页是否会降低效率哪?请大家讨论一下。

关键词

  • .net
  • asp.net
  • asp.net 2.0
  • c#
  • sp1
  • sql server 2000
  • 数据
  • 测试
  • datagrid
  • 控件

得分解答快速导航

  • 帖主:jyk
  • topso
  • cat_hsfz
  • mmqingfeng
  • coolbamboo2008
  • dh20156
  • ljhkim6
  • wuqing5220
  • nameone
  • fstars
  • pwqzc
  • zorou_fatal
  • fellowcheng
  • wd_terry
  • flyingsnowy
  • wd_terry
  • zkxp
  • flyingsnowy
  • dolfen
  • job_2006
  • mmqingfeng
  • mmqingfeng
  • Gerryjiang
  • charles_y
  • bccu
  • longhorn008
  • cyy1981
  • vivi8233
  • dingsongtao
  • longli67
  • topso
  • underwater
  • lizheng__114
  • caobob
  • caobob
  • webwait
  • jieguo
  • ljq688
  • Ivony
  • chenhaoying
  • lesen
  • zhouheng123456
  • zhongkeruanjian
  • Ivony
  • lesen
  • iuhxq
  • underwater
  • roydu
  • webwait
  • Ivony
  • lesen
  • xiahouwen
  • oxfordxyc
  • dapanda
  • songxiaozhao
  • zl9732
  • lcddjyy
  • cat_hsfz
  • ld_thinking
  • Ivony
  • ld_thinking
  • ld_thinking
  • yz_hurrah
  • yz_hurrah
  • Ivony
  • aliketen
  • yz_hurrah
  • Ivony
  • ld_thinking
  • Ivony
  • Ivony
  • yecong
  • shine_88
  • wangjuping
  • zorou_fatal
  • vabug
  • vabug
  • vabug
  • Truly
  • blackmailer
  • vabug
  • cat_hsfz
  • Ivony
  • Radar2006
  • xxqq0824
  • Climb_Tree
  • threemonths
  • jellyeileen
  • axinghe
  • greatbag
  • greatbag
  • loveWife
  • fxqyyzg
  • hanguoji84
  • mendel
  • ilovejolly
  • cat_hsfz
  • shw586
  • shw586
  • minermy
  • husttc
  • mendel
  • cybonline
  • lnwuyaowei
  • greatbag
  • mendel
  • HJ_34
  • xyunsh
  • alby
  • liujiayu10

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo