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

30 篇文章 0 订阅
我以往的人像是: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

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

当然不是,用代码生成器生成的代码……  
   
  也有的地方是数据类自己保存了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

这几天比较忙,没来看回帖,呵呵,这么多的回贴了,兴奋中!  
   
  >>测试目的:网站的页面里面显示数据的效率。只测试显示数据的功能,不管其他的方面。  
   
  这里已经写了我的测试目的,我并不想全面比较   两个控件的   各个方面的优缺点,我只想测试一下一个特殊范围内两个控件的效率   ——   在网页里显示数据,比如显示一个新闻列表。  
   
  就拿显示新闻列表来说吧。  
   
  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
 
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值