E-Mail:115294781@qq.com 联系电话: 020-84226565

.net的性能优化

2013-10-24

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

广州网站建设