ASP.NET使用动态编译技术,在运行时动态将同一目录的*.aspx文件先生成*.cs,然后调用CompilerServices将其编译成assemblies(可以到你的%SYSTEMROOT%\Microsoft.NET\Framework\V1.x.xxxx\Temporary ASP.NET Files下面看看)。因此了解ASP.NET编译的过程是优化ASP.NET运行效率的关键之一。以常用的数据绑定语法为例,我们可以发现它的转化规则是:

.aspx:  data-binding expression %>

->

.cs: System.Convert.ToString(data-binding expression);

其中data-binding expression是原封不动复制过来的,这样你写数据绑定表达式的时候就心里有谱了吧。关于常见于数据绑定表达式中的Container、DataItem、DataBinder.Eval是这样:DataBinder是System.Web里面的一个静态类,它提供了Eval方法用于简化数据绑定表达式的编写,但是它使用的方式是通过Reflection等开销比较大的方法来达到易用性,因此其性能并不是最好的。而Container则根本不是任何一个静态的对象或方法,它是ASP.NET页面编译器在数据绑定事件处理程序内部声明的局部变量,其类型是可以进行数据绑定的控件的数据容器类型(如在Repeater内部的数据绑定容器叫RepeaterItem),在这些容器类中基本都有DataItem属性,因此你可以写Container.DataItem,这个属性返回的是你正在被绑定的数据源中的那个数据项。如果你的数据源是DataTable,则这个数据项的类型实际是DataRowView。

现在你可以想想下面哪种写法效率最高(以Repeater+DataTable数据源为例):

  1. <@% DataBinder.Eval(Container.DataItem, "ColumnName") %>
  2. <@% DataBinder.Eval(Container.DataItem, "ColumnName", null) %>
  3. <@% DataBinder.Eval(Container, "DataItem.ColumnName", null) %>
  4. <@% ((DataRowView)Container.DataItem)["ColumnName"] %>
  5. <@% ((DataRowView)Container.DataItem).Row["ColumnName"] %>

NOTE: 后两种用法需要引入System.Data名称空间……答案一天后揭晓,欢迎有空的朋友自己测试得出结论!


揭晓+简要分析:

乍一看1-3都是使用DataBinder.Eval方法来进行数据绑定计算,而4-5是使用strong type直接获取数据绑定的值。按照我之前的推理,很多朋友会认为4-5都会比1-3快,而实际上第4种用法也是在网上很常见的一种针对DataBinder.Eval而进行的“优化”。

实际上根据我们的测试,第4种写法的效率在某些很常见的情形下(即传入的字段名与数据表内部的字段名大小写有出入时)甚至比不上最普遍的第1种写法。不过原理还是对的,就是避免通过reflection或类似机制(如System.ComponentModel中的PropertyDescriptor机制)获得数据,然而使用DataRowView的indexer的效率在字段数量较多导致Hashtable产生寻址冲突时不如使用其Row属性(DataRow类型)的indexer的效率。原因是DataRowView的indexer实现了view的功能,而这个功能对于大多数应用在这个场合都是不需要的,且它的开销甚至比DataBinder.Eval还要大!(本段内容过于武断,在被反复质疑之下我又做了若干试验寻得正确原因)因此简单的使用第五种写法通常是可以获得较佳的性能的,而最好不要在不必要的时候直接使用DataRowView的indexer。

现在回到1-3的讨论。首先一点,请大家注意看Eval方法的二种overload:

object DataBinder.Eval(object container, string expression)
string DataBinder.Eval(object container, string expression, string format)

注意到ASP.NET在生成的.cs文件中是使用System.Convert.ToString来将Eval的结果转换成string的,因此显式的提供值为null或String.Empty的format参数将使得Eval首先调用第一种方法得到绑定结果的对象,然后直接调用该对象的ToString()方法将其返回到Convert.ToString方法,对于该方法编译器已经在编译期将其连接到Convert.ToString(string)的重载上,而该方法则直接返回传入的字串。那如果直接使用第一种方法呢?虽然第二种方法是先调用第一种方法的,但是由于它的返回值是object类型,编译器将为其选择Convert.ToString(object)的重载,在这个重载方法中将进行一些额外的判断以将对象转换为string类型,而这些额外判断显然带来了额外的开销——尽管基本上算不得主要矛盾。

至于说第3种写法,由于在expression参数中多引入了一层间接,因此需要多进行一次反射以解析表达式,因此效率非常之低。

那这里再卖个关子,请推测第5种方法是否还可以进一步优化?(我是指在最常见的ASP.NET开发情形中):P

通过上面的分析,我们可以得到下面的结论:

  1. DataBinder.Eval是最常用也比较易用的数据绑定表达式写法,但由于其实现机制使用了反射,所以需要关注其所带来的性能损失。通常,当应用开发进入稳定期后可以针对性的对这些表达式进行优化。
  2. 但是优化不是光从字面上就能感觉到的,第4种所谓优化随处可见,然而在某些情况下它反而带来其他环节的开销,带来比较低的执行效率。
  3. 要注意方法重载是一种编译期机制,通过显式告诉编译器需要使用的方法重载,通常可以在得到同样结果的前提下获得更佳的性能。
  4. 性能虽重要,功能价更高——在一般的项目开发中,还是首先关注功能的实现,然后再通过实际测试有针对性的优化比较突出的性能瓶颈。

希望我的这点儿心得对您有所启发。:)

原文:http://www.cnblogs.com/dudu/articles/48608.html

转载于:https://www.cnblogs.com/dagon007/archive/2005/03/14/118165.html

ASP.NET中的数据绑定:哪个更快? (转)相关推荐

  1. [转]最速下降曲线:重力场中两点之间曲线更快

    数学之美:两点之间最快的路径 掉节操的星期一又来了,所以呢一起来观赏一下数学之骚美. 这事儿和17世纪的一道谜题有关,直到后来微积分被建立起来以后才得正解.虽然问题不难,但结果惊艳. 我先来问一个比较 ...

  2. ASP.NET中的数据绑定:哪个更快?

    ASP.NET使用动态编译技术,在运行时动态将同一目录的*.aspx文件先生成*.cs,然后调用CompilerServices将其编译成assemblies(可以到你的%SYSTEMROOT%\Mi ...

  3. 从实战中来,到实战中去——Elasticsearch 技能更快提升方法论

    Elasticsearch 最少必要知识实战教程直播回放 2011年前后,和几个同学一起去游泳馆游泳,在去的路上,我问同学A:"你会游泳吗?",同学A滑稽的回了一句:"我 ...

  4. 在Flutter中更快地加载您的图像资源

    本文主要介绍在Flutter中更快地加载您的图像资源 我们可以将图像放在我们的资产文件夹中,但如何更快地加载它们?这是 Flutter 中的一个秘密函数,可以帮助我们做到这一点 - precacheI ...

  5. WPF入门教程系列十五——WPF中的数据绑定(一)

    使用Windows Presentation Foundation (WPF) 可以很方便的设计出强大的用户界面,同时 WPF提供了数据绑定功能.WPF的数据绑定跟Winform与ASP.NET中的数 ...

  6. (十)更快的排序算法(归并、快排、基数)

    目标 1) 使用下列方法将一个数组按升序排序:归并排序.快速排序和基数排序 2) 评估排序的效率,讨论不同的方法的相对效率 目录 9.1 归并排序 9.1.1 归并数组 9.1.2 递归归并排序 9. ...

  7. dav1d 0.5.1:更快!

    Jean-Baptiste Kempf是VideoLAN非盈利组织的总裁,也是开源VLC媒体播放器的主要开发者之一.12月13日LiveVideoStack-深圳站将会有更多机会与他当面交流技术机会! ...

  8. 【转】asp.net中bind()和eval()的区别

    今天找资料的时候突然发现了这篇文章,觉得不错就拿来与大家分享,欢迎新手学习. eval()方法 在运行时使用反射执行后期绑定计算,因此与标准的ASP.NET数据绑定方法bind相比,会导致性能明显下降 ...

  9. 服务器webpack构建性能,[译] 优化 WEBPACK 以更快地构建 REACT

    如果您的 Webpack 构建缓慢且有大量的库 -- 别担心,有一种方法可以提高增量构建的速度!Webpack 的 DLLPlugin 允许您将所有的依赖项构建到一个文件中.这是一个取代分块的很好选择 ...

最新文章

  1. 【单片机】时钟周期 器械周期 指令周期的关系
  2. 推荐一个个人感觉比较有吸引力的网站
  3. Windows 7键盘失灵导致无法输入登录密码问题解决方案
  4. Linux服务器中实现文件夹可写不可删除
  5. 海量日志分析方案--logstash+kibnana+kafka
  6. P3201-[HNOI2009]梦幻布丁【启发式合并,链表】
  7. 敏捷软件开发12条原则(译)
  8. 60道计算机网络面试题(附答案,背诵版)
  9. 基于Modelingtoolkit的管网组件(Julia)
  10. 【Java实战篇】SpringBoot+MyBatis快速实现登录注册
  11. 海康威视网络摄像头sdk的开发(Demo的使用)指南
  12. P3456 [POI2007]GRZ-Ridges and Valleys
  13. 一文搞懂Kiss、Yagni原则
  14. 1127 判断完全数
  15. twitter账号被冻结如何申诉,已成功解冻(我是第一次被冻结,听闻二次冻结会永久冻结)
  16. MFC视图窗口(CView子类)初始化消息的调用顺序
  17. ThinkPad 水货笔记本
  18. ubuntu20.04下好用的截图软件
  19. 吃鸡游戏对服务器性能,《绝地求生》国服用超性能服务器,网络全互联
  20. 【总结】技术菜鸟找工作总结

热门文章

  1. YUV420图像格式
  2. WordPress打开速度很慢的解决方法
  3. 31 | 套路篇:磁盘 I/O 性能优化的几个思路
  4. pta函数统计素数并求和_关于求和的4种函数公式,此文讲透了,尤其是第4种,绝对的高效...
  5. 海口只有阳光沙滩?错,人家还是“最佳智慧城市”
  6. 程序给UI美术上的必修课:内存占用, DrawCall和包大小的处理
  7. “炉石”以上,“万智”未满《符文之地传奇》为何能有好开局?
  8. 分享:游戏新手引导程序框架设计3要点
  9. 游戏开发者怎么做出以假乱真的画面效果?大气散射渲染了解一下
  10. MySQL复习资料(二)——MySQL-DDL语句