用户操作
[即时聊天] [发私信] [加为好友]
潘宇光ID:superdullwolf
32753次访问,排名3589(1)好友34人,关注者266
超级大笨狼,每天要自强。
superdullwolf的文章
原创 53 篇
翻译 0 篇
转载 0 篇
评论 68 篇
最近评论
superdullwolf:Grayeyeso_o

http://www.dullwolf.cn/Idiom.rar
可以下载了
QQ18795736:老大讲的 COOL
Grayeyeso_o:顶了,顺便求份成语接龙的代码,wxj1987@yahoo.com.cn,地址打不开,谢过了
devoc:很厉害哦你
devoc:晕,怎么点三下就发了三了次哦。麻烦lz删两个哈~
文章分类
收藏
    相册
    偶的照片
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 提高ASPX服务器性能的几大狠招 收藏

    新一篇: 需求未必是变态的,关键看怎么理解需求 | 旧一篇: 最近点对问题[CPP]C# N*LogN复杂度解法

     提高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+=,不过提升的有限,不是本质的数量级别的提升。

    其他招数,欢迎补充排名。

    发表于 @ 2008年07月22日 17:08:00|评论(loading...)|收藏

    新一篇: 需求未必是变态的,关键看怎么理解需求 | 旧一篇: 最近点对问题[CPP]C# N*LogN复杂度解法

    评论

    #QQ18795736 发表于2008-10-13 13:10:35  IP: 58.254.105.*
    老大讲的 COOL
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 潘宇光