.net的性能优化
前段时间,由于学习网的访问速度比较慢,所以研究了下如何优化 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 的运行机制和对象的使用非常熟悉。当然还有一点是非常重要的,就是程序的性能,本来是几句代码可以完成的结果写了一大段,结果是影响了整个页面的性能,这方面的优化得靠自己的基本功和经验来提高了。