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
功能少的快些!这是真理!
我用 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
功能少的快些!这是真理!
相关文章推荐
- Repeater与DataGrid的效率,到底哪个的更好?!(结论很可能和你认为的不一样!)
- [导入]Repeater与DataGrid的效率,到底哪个的更好?!(结论很可能和你认为的不一样!)
- [摘录]Repeater与DataGrid的效率,到底哪个的更好?!精华回帖
- 到底哪个更快?对控件DataGrid ,DataList ,Repeater中每一行遍历时?
- 我们认为的需求可能和真正需求 很不一样
- 对于提高PHP网站的效率,缓存技术和生成HTML静态页技术哪个更好一些?
- APC 和 Memcache 有什么区别,哪个更好效率更高?
- 利用前台程序控制行转列数据的输出,可能从效率和扩展性上更好.一个例子
- 答:SQLServer DBA 三十问之一: char、varchar、nvarchar之间的区别(包括用途和空间占用);xml类型查找某个节点的数据有哪些方法,哪个效率高;使用存储 过程和使用T-SQL查询数据有啥不一样;
- Repeater与DataGrid的效率
- Repeater 与 DataGrid 效率论
- JSP页面小脚本实现日期比较,Java同理,精简过后的,可能在效率上不太好,有大大可以给优化下就更好了
- 对于提高PHP网站的效率,缓存技术和生成HTML静态页技术哪个更好一些?
- JSP页面小脚本实现日期比較,Java同理,精简过后的,可能在效率上不太好,有大大能够给优化下就更好了
- Dictionary<T1,T2>和List<T>哪个效率更好
- .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上(ZT)
- Clander的用法。如何取得当前时间一个月后/前的时间。如何取得某个月的最后一天。 如何取得今年的第一个周一。五月的第二个星期日。 如何取得今年的第一周(注意国外的日历和国内可能不一样,如何设置一周
- 关于何种情况下使用DataGrid、DataList或Repeater的一些讨论
- 到底哪个是真正的我?
- DataBinder在DataGrid、DataList、Repeater中直接获取数据的方法