提高ASPX服務器性能的幾大狠招

提高ASPX服務器性能的幾大狠招
∆ 第0招依靠測試工具,以下根據ACT test測試結果,整理。【全部招數兇狠度的依據】
所謂性能優化,必須是建立在測試的基礎之上的,ACT Test是比較爽的測試工具,比Load Runner方便,比Web Stress直觀,支持腳本編程和錄製登陸到註銷全過程。
所有優化都要進行對比測試,纔是評判的數字依據。
所以,個人認爲:不做壓力測試,優化是可以做,但是沒數據支持,是不嚴謹的。

∆ 第一招生成靜態。【兇狠度排名第一:性能RPS提升兩個數量級(提高速度百倍)】
以下是截取Response的Stream生成文件的代碼
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.102\share\C#高級編程\C#高級編程(第四版).pdf"));               
                undoImpersonation();
            }
            else
            {
                Response.Write("登陸失敗");               
            }
        }
    }
}
∆ 第三招,各種緩存。【兇狠度排名第三:性能RPS提升1個數量級(提高速度十倍級別)】
緩存代碼好找,就不寫了,道理不用多講。

∆ 第四招,減少數據庫往返。【兇狠度排名第四:性能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+=,不過提升的有限,不是本質的數量級別的提升。
其他招數,歡迎補充排名。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章