200分讨论!Repeater与DataGrid的效率,到底哪个的更好?!(结论很可能和你认为的不一样!)
我以往的人像是: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的分页是否会降低效率哪?请大家讨论一下。




