提高ASPX服务器性能的几大狠招

∆ 第0招依靠测试工具,以下根据ACT test测试结果,整理。【全部招数凶狠度的依据】

所谓性能优化,必须是建立在测试的基础之上的,ACT Test是比较爽的测试工具,比Load Runner方便,比Web Stress直观,支持脚本编程和录制登陆到注销全过程。
所有优化都要进行对比测试,才是评判的数字依据。
所以,个人认为:不做压力测试,优化是可以做,但是没数据支持,是不严谨的。

∆ 第一招生成静态。【凶狠度排名第一:性能RPS提升两个数量级(提高速度百倍)】  
以下是截取Response的Stream生成文件的代码 

∆ 第三招,各种缓存。【凶狠度排名第三:性能RPS提升1个数量级(提高速度十倍级别)】
缓存代码好找,就不写了,道理不用多讲。 

protected   override   void  Render(HtmlTextWriter writer) 
    { 
        StringWriter stringWriter 
=   new  StringWriter(); 
        HtmlTextWriter htmlTextWriter 
=   new  HtmlTextWriter(stringWriter);  
        
base .Render(htmlTextWriter); 

        
if  (本页允许生成静态HTML) 
        { 
   
// 根据aspx的get参数构造出的HTML文件名,如:aaa.aspx?id=1 转化成 aaa_id_1.html 
             string  filePath  =  Server.MapPath(htmlFileName); 

            StreamWriter streamWriter 
=   new  StreamWriter(filePath ,  false , Encoding.UTF8); 

            streamWriter.Write(HTML); 

            streamWriter.Close(); 

            htmlTextWriter.Close(); 


生成后,以后先判断是否有这个文件,如果有就跳过去。
本页允许生成静态HTML,可以在后台做一个钩选和更新,并且在内容发生变化后删除静态HTML。

∆ 第二招,图片文件分流服务器。【凶狠度排名第二:性能RPS提升1个数量级(提高速度十倍)】
1,web 1台或多台。
2,图片1台或多台。
3,文件1台或多台。
4,数据库1台或多台。
不同机房要采用Remoting分发文件是个不错的主义,就是工作量大。
以下是同机房多服务器之间可以通过web读写分发文件的关键代码。 

using  System;  
using  System.Collections;  
using  System.Configuration;  
using  System.Data;  
using  System.IO;  
using  System.Web;  
using  System.Web.Security;  
using  System.Web.UI;  
using  System.Web.UI.HtmlControls;  
using  System.Web.UI.WebControls;  
using  System.Web.UI.WebControls.WebParts;  
using  System.Security.Principal;  
using  System.Runtime.InteropServices;  

namespace  WebApplication1  
{  
    
public   partial   class  _Default : System.Web.UI.Page  
    {  
        
public   const   int  LOGON32_LOGON_INTERACTIVE  =   2 ;  
        
public   const   int  LOGON32_PROVIDER_DEFAULT  =   0 ;  

        WindowsImpersonationContext impersonationContext;  

        [DllImport(
" advapi32.dll " , CharSet  =  CharSet.Auto)]  
        
public   static   extern   int  LogonUser(String lpszUserName,  
                                  String lpszDomain,  
                                  String lpszPassword,  
                                  
int  dwLogonType,  
                                  
int  dwLogonProvider,  
                                  
ref  IntPtr phToken);  
        [DllImport(
" advapi32.dll " , CharSet  =  CharSet.Auto, SetLastError  =   true )]  
        
public   extern   static   int  DuplicateToken(IntPtr hToken,  
                                 
int  impersonationLevel,  
                                 
ref  IntPtr hNewToken);  
        
private   bool  impersonateValidUser(String userName, String domain, String password)  
        {  

            IntPtr token 
=  IntPtr.Zero;  
            IntPtr tokenDuplicate 
=  IntPtr.Zero;  

            
if  (LogonUser(userName, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,  ref  token)  !=   0 )  
            {  
                
if  (DuplicateToken(token,  2 ref  tokenDuplicate)  !=   0 )  
                {  
                    WindowsIdentity tempWindowsIdentity;  
                    tempWindowsIdentity 
=   new  WindowsIdentity(tokenDuplicate);  
                    impersonationContext 
=  tempWindowsIdentity.Impersonate();  
                    
if  (impersonationContext  !=   null )  
                        
return   true ;  
                    
else   
                        
return   false ;  
                }  
                
else   
                    
return   false ;  
            }  
            
else   
                
return   false ;  
        }  
        
private   void  undoImpersonation()  
        {  
            impersonationContext.Undo();
// 回退为未更改前账户  
        }  
        
protected   void  Page_Load( object  sender, EventArgs e)  
        {  
            
// 临时更改为 跟 网络硬盘相同用户名密码的账户(此账户必须在网络盘有写入权限)本机也需要同样帐号密码的帐户  
             if  (impersonateValidUser( " administrator " " 192.168.1.102 " " kuqu123456 " ))  
            {               
                Response.Write(System.IO.File.Exists(
@" /192.168.1.102shareC#高级编程C#高级编程(第四版).pdf " ));                 
                undoImpersonation();  
            }  
            
else   
            {  
                Response.Write(
" 登陆失败 " );                  
            }  

        }  
    }  
}  

 

∆ 第四招,减少数据库往返。【凶狠度排名第四:性能RPS提升和往返次数有关】
能一次取的数据,就不要多次,尤其在绑定的行里多次执行存储过程。

∆ 第五招,少用对象。【凶狠度排名第五:性能RPS提升取决于对象数量】
用Static函数执行SQL,绑定数据或者增删查改,来代替 new一堆对象去绑定List或者设置属性。

∆ 第六招,多用Ajax和客户端HTML代码,少用服务器控件,减少刷新和ViewState。【凶狠度排名第六:性能RPS提升取决于具体界面功能】
道理不用多讲,服务器控件垃圾比较多。

∆ 第七招,采用好的数据结构容器和算法。。【凶狠度排名第七:性能提升取决于算法复杂度,普通Web开发这种情况不多见,但是特殊开发要重视!~~】
哈希类性能最好,查找复杂度是O(1),例如:Dictionnary <T,T>,
二叉树查找复杂度是O(Log n),排序O(n*Log n),List和ArraList自带的排序速度是接近(n*Log n),
数组类的线性查找O(n),如果你用冒泡排序O(n*n),那么你不是优秀程序员。
StringBuilder 性能好于 string+=,不过提升的有限,不是本质的数量级别的提升。

(待续)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值