.NET中26只优化性能方法

  1. 数据库访问性能优化 
     
    数据库的总是和关

访问数据库资源用创造连接、打开连接和倒闭连接几乎单操作。这些过程需要反复暨数据库交换信息以通过身份验证,比较耗费服务器资源。ASP.NET中提供了连接池(Connection
Pool)改善打开和关闭数据库对性的熏陶。系统以用户的数据库连接在连接池中,需要经常取出,关闭时收回连接,等待下一致浅的连接要。连接池的深浅是个别的,如果当连接池达到最好老限度后按要求创建连接,必然大大影响性。因此,在树数据库连接后只有当真用操作时才打开连接,使用完毕后及时关闭,从而尽量减少数据库连接打开的时空,避免出现超出连接限制的气象。
  

行使存储过程
 
 
积存过程是储存在服务器上之均等组预编译的SQL语句,类似于DOS系统受到的批处理公事。存储过程具有对数据库及时访问的效力,信息处理极为迅速。使用存储过程得避对命令的频繁编译,在推行同一不良后那个执行规划纵驻留在高速缓存中,以后要经常就需要直接调用缓存中的亚迈入制代码即可。另外,存储过程在劳动器端运行,独立为ASP.NET程序,便于修改,最根本之是她可减少数据库操作语词以网被之传输。

优化查询语句
  
ASP.NET中ADO连接消耗的资源一定深,SQL语句运行的时间更是丰富,占用系统资源的时日也越长。因此,尽量用优化了的SQL语句以缩减执行时。比如,不在查询语句中包含子查询语句,充分利用索引等。
  

  1. 字符串操作性能优化 
     
    使用值类型的ToString方法
      
    当连续字符串时,经常采取”+”号一直将数字增长到字符串中。这种方法虽然简单,也得以获不错结果,但是由涉及到不同的数据类型,数字要通过装箱操作转化为援类型才堪增长到字符串中。但是装箱操作对性影响比较充分,因为当进展及时类处理常,将以托管堆中分红一个新的对象,原有的值复制到新创造的目标被。使用值类型的ToString方法可避免装箱操作,从而增强应用程序性能。
      

运用StringBuilder类   

String
类似对象是不行变更的,对于String对象的重复赋值在真相上是重复创设了一个String对象并拿新值赋予该目标,其方式ToString对性能的增强并非好显著。在处理字符串时,最好用StringBuilder类,其.NET
取名空间是System.Text。该类并非创建新的目标,而是经过Append,Remove,Insert等办法直接指向字符串进行操作,通过
ToString方法返回操作结果。   其定义及操作语句子如下所示:

int num;
  System.Text.StringBuilder str = new System.Text.StringBuilder();
//创建字符串
  str.Append(num.ToString()); //添加数值num
  Response.Write(str.ToString);
//显示操作结果3. 优化 Web
服务器计算机与特定应用程序的布局文件为适合您的特定需要

默认情况下,ASP.NET
安排于安装成启用最广大的法力并尽可能适应最普遍的方案。因此,应用程序开发人员可以依据应用程序所用的效用,优化以及改内部的少数配置,以增强应用程序的属性。下面的列表是若该考虑的片增选。

惟有对亟待的应用程序启用身份验证。

默认情况下,身份验证模式也
Windows,或集成 NTLM。大多数情下,对于欲身份验证的应用程序,最好当
Machine.config 文件中禁用身份验证,并于 Web.config
文本中启用身份验证。根据当的请求和响应编码设置来布局应用程序。ASP.NET
默认编码格式为 UTF-8。如果你的应用程序为从严的
ASCII,请配置应用程序使用 ASCII 以抱多少的习性提高。
  
设想针对应用程序禁用 AutoEventWireup。


Machine.config 文件中将 AutoEventWireup 属性设置为
false,意味着页面不将艺术名及事件开展匹配和将两端关系(例如
Page_Load)。如果页面开发人员要下这些事件,需要在基类中再次写这些点子(例如,需要吗页面加载事件再写
Page.OnLoad,而未是使用
Page_Load 方法)。如果禁用
AutoEventWireup,页面将经过以事件接二连三留给页面作者而无是活动执行其,获得多少的性质提升。

起央处理管线中移除不用的模块。

默认情况下,服务器计算机的 Machine.config 文件中
节点的有所机能都保存为激活。根据应用程序所运用的成效,您得起呼吁管线中移除不用的模块以获取多少的性质提升。检查每个模块及其职能,并按您的内需打定义其。例如,如果您在应用程序中无采用会话状态与输出缓存,则可于
列表中移除它们,以便要于匪履行另外有含义的拍卖时,不必执行每个模块的上和距离代码。

  1. 定要是禁用调试模式  

当布局生产应用程序或开展其它性质测量之前,始终铭刻禁用调试模式。如果启用了调试模式,应用程序的属性可能受特别深的熏陶。
  

5.
对此周边依赖外部资源的应用程序,请考虑在多处理器计算机上启用网络园艺  

ASP.NET
过程模型帮助启用多处理器计算机上的可缩放性,将工作分发给多只经过(每个CPU一个),并且每个过程都将电脑关系设置也那个
CPU。此技术称为网络园艺。如果应用程序使用比较缓慢的数据库服务器或调用具有外部依赖项之
COM
目标(这里只是提及两栽可能性),则也汝的应用程序启用网络园艺是便利的。但是,在控制启用网络园艺之前,您应该测试应用程序在网络园中的履情况。
  

  1. 如可能,就缓存数据和页输出  

ASP.NET
供了部分简单的体制,它们会于无需呢每个页请求动态计算页输出或数额时缓存这些页输出或数量。另外,通过计划要开展缓存的页与数码要(特别是在站点中预期将发于生通讯量的区域),可以优化这些页的属性。与
.NET Framework 的别 Web
窗体功能相比,适当地动用缓存可以重复好之滋长站点的特性,有时这种增长是超过数量级的。使用
ASP.NET
缓存机制来少沾需要注意。首先,不要缓存太多桩。缓存每个码都发生出,特别是在内存以方面。不要缓存容易重新计算和老少使用的起。其次,给缓存的宗分配的有效期不要太缺。很快到的项会导致缓存中莫必要之周转,并且经常导致更多的代码清除和垃圾堆回收工作。若关心这个题材,请监视及
ASP.NET Applications 性能对象关联的 Cache Total Turnover Rate
属性计数器。高周转率可能证明有问题,特别是当项于临前被移除时。这吗称作内存压力。

  1. 挑选切合页面或应用程序的数目查看机制  

冲你选择于 Web
窗体页显示数据的法,在福利及性质之间时有在重大之衡量。例如,DataGrid
Web
服务器控件可能是一样种显示数据的方便快捷的方式,但哪怕性能而言它的开支常常是最特别之。在一些简单的情事下,您通过转变适当的
HTML
好表现数据或许那个行,但是从定义和浏览器定向会很快抵销所获取的附加功效。Repeater
Web 服务器控件是有利和属性的低头。它快、可自定义且可编程。
  

  1. 将 SqlDataReader 类用于快速只前行多少游标  

SqlDataReader 类提供了同种读取从 SQL
Server 数据库检索的才前行数据流的法子。如果当创建 ASP.NET
应用程序时起允许而运她的情状,则 SqlDataReader 类提供比较
DataSet 类更胜之特性。情况用如此,是因 SqlDataReader 使用 SQL
Server
的本机网络数据传格式从数据库连接直接读取数据。另外,SqlDataReader
类实现 IEnumerable
接口,该接口也允许你将数据绑定到服务器控件。有关重新多信息,请参见
SqlDataReader 类。有关 ASP.NET 如何看数的音,请参见通过
ASP.NET 访问数。   

  1. 将 SQL Server 存储过程用于数据看  

在 .NET Framework
供的有着数据访问方法被,基于 SQL Server 的多寡看是坏成大性能、可缩放
Web 应用程序的推荐选择。使用托管 SQL Server
提供程序时,可透过利用编译的囤过程要不是特查询得到额外的性提高。
  

  1. 免单线程单元 (STA) COM
    组件  

默认情况下,ASP.NET 不允许其他 STA COM
组件在页面内运行。若要运行它们,必须于 .aspx 文件内将
ASPCompat=true 属性包含在 @ Page 指令中。这样就用执用底线程池切换到
STA 线程池,而且如果 HttpContext
与其余内置对象可是用以 COM
对象。前者为是一样种植特性优化,因为它们避免了将大半线程单元 (MTA) 封送至 STA
线程的外调用。使用 STA COM
零件可能大大损害性,应尽可能避免。若必须使用 STA COM 组件,如在其他
interop
方案被,则答应在执行中开展大量调用并在每次调用内发送尽可能多之音。另外,小心不要在组织页面中创建任何
STA COM
零件。例如下面的代码中,在页面构造时拿实例化由某线程创建的
MySTAComponent,而拖欠线程并无是以运行页面的 STA
线程。这或针对性能有不利影响,因为要结构页面就非得就 MTA 和 STA
线程之间的封送处理。

Dim myComp as new
MySTAComponent() Public Sub Page_Load() myComp.Name = “Bob” End Sub

首选机制是推对象的始建,直到以后当 STA
线程下执行上述代码,如下面的例证所示。

Dim
myComp Public Sub Page_Load() myComp = new MySTAComponent() myComp.Name
= “Bob”
End Sub

推荐的做法是当得时要么当 Page_Load 方法吃结构任何 COM
组件和表面资源。永远不要用其他 STA COM
组件存储于可由组织其的线程以外的任何线程访问的共享资源里。这仿佛资源包括诸如缓存和对话状态这样的资源。即使
STA 线程调用 STA COM 组件,也只有构造是
STA COM
组件的线程能够实际也该调用劳动,而立即要求封送处理对创建者线程的调用。此封送处理或有第一的特性损失以及可伸缩性问题。在这种景象下,请研究一下要
COM 组件成为 MTA COM
组件的可能性,或者再次好的艺术是搬迁代码以使对象成托管对象。   

  1. 以调用密集型的 COM
    组件迁移至托管代码  

.NET Framework 提供了一个简单易行的办法和俗的 COM
组件进行互动。其亮点是得在保存现有投资的又使用新的平台。但是于好几情况下,保留老组件的习性开销让用零件迁移到托管代码是值得的。每一样动静尚且是勿雷同的,决定是否要迁移组件的尽好方式是指向
Web
站点运行性能测量。建议乃研究一下什么将待大量调用以进行互动的别样COM
组件迁移到托管代码。许多状况下未可能用旧式组件迁移到托管代码,特别是在最初迁移
Web
应用程序时。在这种气象下,最可怜之性障碍之一是将数据从非托管环境封送至托管环境。因此,在相互操作着,请以其余一样端执行尽可能多之职责,然后开展一个老大调用而非是同样多级小调用。例如,公共语言运行库中的具有字符串都是
Unicode 的,所以应以调用托管代码之前以零件中之具备字符串转换成 Unicode
格式。另外,一处理了其他 COM
目标要本机资源就自由它们。这样,其他请求虽会使它们,并且最酷限度地回落了坐稍后请求垃圾回收器释放它们所招的性问题。
  


  1. Visual Basic .NET 或 JScript. 代码中应用最初绑定  

往年,开发人员喜欢使用 Visual
Basic、VBScript. 和 JScript.
的缘由之一就是是它所谓“无类型”的习性。变量不需显式类型声明,并会简单地经应用来创造它们。当从一个列及其他一个列进行分配时,转换将机关执行。不过,这种便宜会大大挫伤应用程序的习性。Visual
Basic 现在通过以 Option Strict
编译器指令来支持项目安全编程。为了向后相当,默认情况下,ASP.NET
未启用该选项。但是,为了博取最佳性能,强烈建议在页中启用该选项。若使启用
Option Strict,请用 Strict 属性包括于 @ Page
令中,或者,对于用户控件,请用该属性包括于 @ Control
命中。下面的言传身教演示了哪些设置该属性,并拓展了季个变量调用以显示应用该属性是怎么促成编译器错误的。

JScript. .NET
为支撑无类型编程,但它不提供强制早期绑定的编译器指令。若有下面任何一样种植情形,则变量是终绑定的:被显式声明也
Object,是无类型声明的类的字段,是无显式类型声明的专用函数或方式成员,并且无法从其利用度出类型。
  最后一个异样比较复杂,因为要是 JScript.
.NET
编译器可以根据变量的行使状况想出类型,它便会进展优化。在下面的言传身教中,变量
A 是早期绑定的,但变量 B 是深绑定的。

var A;
  var B;   A = “Hello”;   B = “World”;   B = 0;
为了获得最佳的性,当声明 JScript. .NET
变量时,请也那个分配一个列。例如,var A : String。

  1. 如求管线外之具有模块尽可能快  

恳请管线外之具备模块于每次要被还发出会让周转。因此,当求进入与离模块时飞地触发代码至关重要,特别是在不以模块功能的代码路径里。分别在动和非动模块和布局文件时实行吞吐量测试,对规定这些方法的行进度特别有效。

  1. 利用 HttpServerUtility.Transfer 方法以同应用程序的页面间重定向  

采用 Server.Transfer
语法,在页面中采用该方法可避免不必要的客户端重定向。
  

  1. 必备经常调整应用程序每个援进程的线程数  

ASP.NET
的请求组织试图以推行要的线程数和可用资源之间及平等栽平衡。已知晓一个行使足够
CPU 功率的应用程序,该组织以根据可用来请求的 CPU
功率,来决定同意而推行之请数。这项技艺称作线程门控。但是在一些规则下,线程门控算法不是雅有效。通过运用以及
ASP.NET Applications
特性对象关系的 Pipeline Instance Count 性能计数器,可以当 PerfMon
中监线程门控。当页面调用外部资源,如数据库访问还是 XML
Web services 请求时,页面请求通常已并释放
CPU。如果有请求在等候给拍卖,并且线程池中生出一个线程是随便的,那么这正在等的请将启幕给处理。遗憾的凡,有时就说不定导致
Web
服务器上是大气而处理的伸手和不少正值等待的线程,而其对准服务器性能有不利影响。通常,如果门控因子是表面资源的响应时间,则叫了多请等待资源,对
Web
服务器的吞吐量并凭帮助。为缓和这种情景,可以由此转 Machine.config
配置文件节点的 maxWorkerThreads 和
maxIOThreads 属性,手动设置过程遭到之线程数限制。   

留神:辅助线程是故来处理 ASP.NET 请求的,而 IO
线程则是用来为来源文件、数据库或 XML Web services
的多少提供劳动之。分配为这些性的价是过程面临每个 CPU
每类线程的顶可怜数目。对于双处理器计算机,最大数是设置值的星星倍。对于四处理器计算机,最大值是设置值的季倍增。无论如何,对于发生四单或八只
CPU
的处理器,最好还改默认值。对于发生一个或者鲜只电脑的电脑,默认值就足以,但于发出再次多处理器的微机的性,进程被有一百要么两百单线程则弊大于利。注意进程中来极致多线程往往会下降服务器的速度,因为额外的上下文交换导致操作系统将
CPU 周期花在保障线程而未是处理要上。   

  1. 适地采取集体语言运行库的污物回收器和电动内存管理  

小心不要受每个请求分配了多内存,因为这样垃圾回收器将必须再次累地开展更多的行事。另外,不要为无必要之指针指向对象,因为它以设对象保障活动状态,并且应尽可能避免含
Finalize 方法的目标,因为它在后边会促成更多之办事。特别是在 Finalize
调用中永远不要放资源,因为资源在为垃圾回收器回收之前恐怕一直消耗在内存。最后是问题常常会面针对
Web 服务器环境之属性造成毁灭性的打击,因为于守候
Finalize 运行时,很轻耗尽某个特定的资源。   

  1. 如果出大型 Web
    应用程序,可考虑执行预批编译  

以发生对目录的第一不成呼吁时还见面实行批编译。如果目录中之页面没有受解析并编译,此作用会化为批分析并编译目录中的具有页面,以便更好地使用磁盘和内存。如果立刻需要充分丰富日子,则用速分析并编译单个页面,以便要能让处理。此意义带被
ASP.NET
性能达到的补,因为它们用许多页面编译为单个程序集。从都加载的次序集看同一页比每页加载新的程序集如赶早。批编译的短处在于:如果服务器收到到多针对没编译的页面的乞求,那么当
Web
服务器解析并编译它们常,性能可能较差。为化解这题目,可以执行预批编译。为是,只需要以应用程序激活之前为她要一个页面,无论哪页都只是。然后,当用户首不好拜访您的站点时,页面及其程序集将曾经让编译。没有简单的编制好掌握批编译何时有。需一直等交
CPU 空闲或者没再多之编译器进程(例如 csc.exe(C# 编译器)或
vbc.exe(Visual Basic
编译器))启动。还许诺竭尽避免更改应用程序的 \bin
目录中之次集。更改页面会导致更分析及编译该页,而替换 \bin
目中之顺序集则会招致全盘还批编译该目录。在富含众多页面的周边站点上,更好的主意或是冲计划替换页面或程序集的数程度来规划不同之目结构。不常更改的页面可以储存在同样目录中并以一定的年月进行预批编译。经常改变的页面应于她自己之目录中(每个目录最多几百页)以便飞编译。Web
应用程序可以涵盖众多子目录。批编译发生在目录级,而不是应用程序级。

  1. 并非借助代码中的不可开交  

盖十分大大地降落性能,所以你不该拿它们用作决定正常程序流程的不二法门。如果有或检测到代码中可能引致大的状态,请执行这种操作。不要当拍卖该状态之前捕获异常本身。常见的方案包括:检查
null,分配给将分析也数字值的 String
一个价值,或在运数学运算前检查特定值。下面的以身作则演示可能致大的代码和测试是否存在某种状态的代码。两者有相同的结果。

  try
  {   result = 100 / num;   }   catch (Exception e)   {
  result = 0;   }   //
…to this.   if (num != 0)   result = 100 / num;   else
  result = 0;

  1. 运 HttpResponse.Write 方法开展字符串串联

拖欠方式供好有效之缓冲和连接服务。但是,如果你在实践广泛的连日,请以多独
Response.Write 调用。下面示例中显的技艺比用对
Response.Write 方法的么调用连接字符串更快。

Response.Write(“a”);
  Response.Write(myString);   Response.Write(“b”);
  Response.Write(myObj.ToString());   Response.Write(“c”);
  Response.Write(myString2);   Response.Write(“d”); 20.
除非有新鲜的故使关缓冲,否则一经该维持开拓

剥夺 Web 窗体页的休养冲会造成大气之性能开销。   

  1. 惟有以必要时保留服务器控件视图状态  

自动视图状态管理是服务器控件的功力,该意义而服务器控件可以在来回过程及还填写它们的属性值(您不欲编制任何代码)。但是,因为服务器控件的视图状态在隐身的窗体字段受到来回于服务器,所以该意义确实会指向性能有震慑。您当掌握当安状态下视图状态会拥有帮助,在哪些情况下它们影响页的性。例如,如果你将服务器控件绑定到每个往返过程及之数码,则将用从数量绑定操作获得的新值替换保存之视图状态。在这种场面下,禁用视图状态可以省处理时。默认情况下,为富有服务器控件启用视图状态。若要禁用视图状态,请用控件的EnableViewState
性能设置也 false,如下面的 DataGrid 服务器控件示例所示。

若还足以行使 @ Page
命禁用所有页的视图状态。当您不打页回发到服务器时,这将很行:

注意Control 指令中为支持
EnableViewState
属性,该令允许你决定是否为用户控件启用视图状态。若使分析页上服务器控件使用的视图状态的数据,请(通过将
trace=”true” 属性包括以 @ Page 指令中)启用该页的跟踪并查阅 Control
Hierarchy 表的 Viewstate
列。有关跟踪以及什么启用其的信息,请参见 ASP.NET 跟踪。

  1. 避到服务器的免必要之来回来去过程  

虽说您大可能要尽可能多地采取 Web
窗体页框架的那些节省时间和代码的效用,但以少数情况下可不宜使用
ASP.NET
服务器控件和回发事件处理。通常,只有当追寻或存储数据时,您才要启动到服务器的往来过程。多数数码操作而每当这些往返过程之中的客户端上开展。例如,从
HTML
窗体验证用户输入经常可在多少交到至服务器之前以客户端进行。通常,如果无欲拿信息传送至服务器因为将那个储存在数据库被,那么你不应当编写导致往返过程的代码。如果你支付自定义服务器控件,请考虑于它们也永葆
ECMAScript.
的浏览器呈现客户端代码。通过为这种办法下服务器控件,您可以明确地抽信息为无必要的殡葬到
Web 服务器的次数。

使用
Page.IsPostBack
免对来往过程实行不必要之处理

要你编写处理服务器控件回发处理的代码,有时可能用在首次等呼吁页时执行外代码,而非是当用户发送包含在该页中之
HTML 窗体时实行的代码。根据该页是否是应服务器控件事件转的。

使用 Page.IsPostBack
特性有标准地推行代码

譬如,下面的代码演示如何创造数据库连接和下令,该令在首赖呼吁该页时用数据绑定到
DataGrid
服务器控件。

void Page_Load(Object sender, EventArgs e)   {   // Set up a
connection and command here.   if (!Page.IsPostBack)   {   String
query =
“select * from Authors where FirstName like ‘%JUSTIN%'”;
  myCommand.Fill(ds,
“Authors”);   myDataGrid.DataBind();   }   }

由每次要时犹实施 Page_Load
事件,上述代码检查 IsPostBack 属性是否设置为
false。如果是,则履行代码。如果该属性设置也 true,则无履代码。注意
倘非运行这种检讨,回发页的所作所为拿无更改。Page_Load
事件之代码在推行服务器控件事件前实施,但单出服务器控件事件的结果才可能以出口页上呈现。如果不运行该检查,仍用为
Page_Load
事件及该页上的别服务器控件事件实施处理。   

  1. 当不行使会话状态时禁用她  

并无是拥有的应用程序或页还要针对被具体用户之对话状态,您应该针对另外不欲会话状态的应用程序或页禁用会话状态。
  若要禁用页的对话状态,请用 @ Page 指令中之 EnableSessionState
属性设置为
false。例如:

注意:如果页需要拜访会说话变量,但非打算创建或者改动其,则用@ Page
指令中的
EnableSessionState 属性设置也ReadOnly。还可以禁用 XML Web services
方法的对话状态。有关重新多信息,请参见下
ASP.NET 和 XML Web services 客户端创建的 XML Web
services。若要禁用应用程序的对话状态,请于应用程序
Web.config 文件的 sessionstate 配置节中将 mode 属性设置为 off。例如:

  1. 密切挑选对话状态提供程序  

ASP.NET
为存储应用程序的对话数据提供了三种不同之法子:进程内见面说话状态、作为
Windows
劳之历程外会话状态与 SQL Server
数据库被的历程外会话状态。每种方式都来和好之独到之处,但过程内见面说话状态是至今速度最好抢之缓解方案。如果仅仅当对话状态被存储少量易失数据,则提议您运过程内提供程序。进程外解决方案主要用于跨多只电脑或多独计算机缩放应用程序,或者用于服务器或进程又启航时不能够少数据的情事。有关重新多信息,请参见
ASP.NET 状态管理。   

  1. 不应用未必要之Server
    Control

ASP.net中,大量的劳动器端控件方便了先后开发,但为或带来性能的损失,因为用户每操作一软服务器端控件,就发相同浅以及劳务器端的来回来去过程。因此,非必不可少,应当少使用Server
Control。   

  1. ASP.NET应用程序性能测试  

以对ASP.NET应用程序进行性能测试之前,应确保应用程序没有不当,而且意义是。具体的性质测试好动用以下工具进行:Web
Application Strees Tool
(WAS)是Microsoft发布的一个免费测试工具,可以打http://webtool.rte.microsoft.com/上下载。它可如法炮制成百上千个用户同时针对web应用程序进行访问请求,在服务器上形成流量负载,从而达到测试的目的,可以生成平均TTFB、平均TTLB等性汇总报。Application
Center Test (ACT) 是一个测试工具,附带给Visual
Studio.NET的庄版受,是Microsoft正式支持之web应用程序测试工具。它能直观地生成图表结果,功能比WAS多,但无抱有多个客户机同时测试的能力。服务器操作系统”管理工具”中的”性能”计数器,可以对服务器进行监测以询问应用程序性能。
  

结论:

对于网站开发人员来说,在编辑ASP.NET应用程序时只顾性能问题,养成好的习惯,提高应用程序性能,至少得延迟必需的硬件升级,降低网站的本。

来自:http://www.cnblogs.com/junjie94wan/archive/2012/05/09/2491004.html