前段时间,由于学习网的访问速度比较慢,所以研究了下如何优化asp.net的程序,在网上查了很多资料,最后总结了以下经验:
一、SqlDataRead和Dataset的选择
Sqldataread优点:读取数据非常快。如果对返回的数据不需做大量处理的情况下,建议使用SqlDataReader,其性能要比datset好很多。缺点:直到数据读完才可close掉于数据库的连接 (SqlDataReader 读数据是快速向前的。SqlDataReader 类提供了一种读取从 SQL Server 数据库检索的只进数据流的方法。它使用 SQL Server 的本机网络数据传输格式从数据库连接直接读取数据。DataReader需及时显式的close。可及时的释放对数据的连接。)
Dataset是把数据读出,缓存在内存中。缺点:对内存的占用较高。如果对返回的数据需做大量的处理用Dataset比较好些可以减少对数据库的连接操作。优点:只需连接一次就可close于数据库的连接
一般情况下,读取大量数据,对返回数据不做大量处理用SqlDataReader.对返回数据大量处理用datset比较合适.对SqlDataReader和Dataset的选择取决于程序功能的实现。
二、ExecuteNonQuery和ExecuteScalar
对数据的更新不需要返回结果集,建议使用ExecuteNonQuery。由于不返回结果集可省掉网络数据传输。它仅仅返回受影响的行数。如果只需更新数据用ExecuteNonQuery性能的开销比较小。
ExecuteScalar它只返回结果集中第一行的第一列。使用 ExecuteScalar 方法从数据库中检索单个值(例如id号)。与使用 ExecuteReader 方法, 返回的数据执行生成单个值所需的操作相比,此操作需要的代码较少。
只需更新数据用ExecuteNonQuery,单个值的查询使用ExecuteScalar
三、数据的绑定DataBinder
一般的绑定方法<%# DataBinder.Eval(Container.DataItem, "字段名") %>
用DataBinder.eval 绑定不必关心数据来源(Dataread或dataset)。不必关心数据的类型eval会把这个数据对象转换为一个字符串。在底层绑定做了很多工作,使用了反射性能。正因为使用方便了,但却影响了数据性能。
对数据的绑定建议使用<%# ctype(Container.DataItem,DataRowView).Row["字段名"] %>。数据量大的时候可提高几倍的速度。使用时注意两方面:
1.需在页面添加<%@ Import namespace="System.Data"%>.
2.注意字段名的大小写(要特别注意)。如果和查询的不一致,在某些情况下会导致比<%# DataBinder.Eval(Container.DataItem, "字段名") %>还要慢。如果想进一步提高速度,可采用<%# ctype(Container.DataItem,DataRowView).Row(0) %>的方法。不过其可读性不高。
四、使用存储过程
性能方面:存储过程提供了许多标准sql语言中所没有的高级特性。其传递参数和执行逻辑表达式的功能,有助于应用程序设计者处理复杂任务。另外,存储过程存储在本地服务器上,减少了执行该过程所需的网络传输宽带和执行时间。(存储过程已经对sql语句进行了预编译,所以其执行速度比在程序里执行sql语句快很多)
程序结构方面:从程序的可扩展性看,使用存储过程会对程序以后的修改带来方便。比如数据库的结构改变了,只需修改相对应的存储结构,和程序中的调用部分即可。
五、大量查询时使用分页查询
如果我们有大量的数据要查询,但是显示的时候是一页一页的显示,这是我们可以用分页查询的功能,就是需要多少数据就查询多少数据,这样至少可以从两个方面优化速度:
1. 传输的数据少,可以减少带宽的压力。
2. 由于查询的数据少,可以减少数据库的查时间。
六、EnableViewState(页面的视图状态)。如果无特殊要求设置为false。
他主要是用于维护页面的 UI 状态,Web 是没有状态的,ASP.NET 页面也没有状态,它们在到服务器的每个往返过程中被实例化、执行、呈现和处理,因此他的存在是要消耗服务器的性能的,当然他的存在也可以减少我能很多的代码,因为很多控件的状态他帮我们维护了,在不需要维护状态的情况下完全可以禁用viewstate。
如下所示:
单个页面:<%@ Page EnableViewState="False" %>
所有的页面:在 web.config 中 <Pages EnableViewState="false" />
七、Html控件和服务器控件的选择
服务器控件带来的方便和功能上的实现是html控件所不能比拟的。但是是以牺牲服务器端的资源来取得的。我个人建议:如果html控件达不到所要实现的功能,而且和一些脚本语言(如javascrpt/vbscript)结合也不能实现的话,才会选择服务器控件。
主要针对几个常用数据控件说明一下:
DataGrid:自带最强大的数据显示控件,内置了对数据的修改、删除、添加、分页等很多实用功能。如果你只需对数据显示的话,尽量不要选择DataGrid(它把数据都存储在viewstate中),也不要使用自带的分页功能,microsoft在自动分页的底层做了很多工作,虽然使用方便了,但性能开销大了。
DataList:比DataGrid功能少了很多。但自定义性强了很多。特有的多行数据显示,给我们带来了很多方便。DataGrid能实现的功能,它基本能实现,所以建议使用它。
Repeater:功能最少,但自定义性非常强。如果只需对数据显示,建议使用。由于减少了很多功能,对服务器的性能带来消耗最小。因此,如果是对数据显示的话,我基本上都是选择 Repeater然后DataList最后DataGrid 尽量选择html控件,能在客户端实现的功能就在客户端实现(熟练掌握javascript),减少服务器的压力。数据控件选择顺序:Repeater、DataList、DataGrid 。
八、String和StringBuilder的比较
String类对象是不可改变的,对于String对象的重新赋值在本质上是重新创建了一个String对象并将新值赋予该对象,其方法ToString对性能的提高并非很显著。
在处理字符串时,最好使用StringBuilder类,其.NET 命名空间是System.Text。该类并非创建新的对象,而是通过Append,Remove,Insert等方法直接对字符串进行操作,通过ToString方法返回操作结果。
以上几点只是个人总结和从网上摘抄的,其实asp.net的优化远不止这些,如果要做好他需要对.net的运行机制和对象的使用非常熟悉。当然还有一点是非常重要的,就是程序的性能,本来是几句代码可以完成的结果写了一大段,结果是影响了整个页面的性能,这方面的优化得靠自己的基本功和经验来提高了。