提高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+=,不过提升的有限,不是本质的数量级别的提升。 其他招数,欢迎补充排名。