摘要:当网站访问文件或外部资源例如数据库或web service时,处理请求的线程需要等待这些资源响应,它会被阻塞。这个线程不能做任何事情,此时,可能有其它请求等待这个线程。 可以使用异步方法访问文件或外部资源解决这个问题。这些方法当开始等待时,就释放线程,而不是阻塞它,所以线程可以由其它请求使用。当资源空闲时,从线程池中获取一个新线程进行处理。 这章演示如果将阻塞线程的同步代码转换成异步代码。每个例子...
阅读全文
摘要:缓存可以将web页面保存在访问者的浏览器、中间代理和服务器内存中。这样,就不用每次请求都重新生成页面,降低了CPU和数据库的负载。 浏览器缓存:保存文件在浏览器缓存中,这样浏览器就不需要下载页面。 代理缓存:保存文件在代理服务器上。 输出缓存:在web服务器上缓存.aspx页面,这样就不用重新生成页面,降低了CPU和数据库的负载。 基于IIS的缓存:使用IIS内置的缓存。 数据缓存:缓存...
阅读全文
摘要:识别瓶颈 有多项技术可以在识别高CPU占用率代码: 重点关注频繁执行的代码。循环,特别是嵌套循环,需要特别注意。如果对使用继承自IComparable类进行排序,这段代码会执行得非常频繁。如果从数据库获取数据,每一行数据都要处理,这也会使用到循环。 可以使用轻量级的计数器,测量执行的频率和执行的时间。 进行老式的调试。对网站进行压力测试,这样会使用很多CPU。减少一半代码,如果CPU使用率减...
阅读全文
摘要:本篇讨论以下内容: 网站中消耗内存的主要两类对象:托管资源和非托管资源。 托管资源的生命周期。 减少托管资源和非托管资源内存使用的方法。 减少session使用的内存。如果使用不当,session会占用很多内存。 托管资源 托管资源是在代码中使用new关键字在堆上创建的对象。 生命周期 当调用new创建对象时,会在托管堆上分配内存。这只会发在在分配区域的末尾,这样效率会很高。 当CLR在分...
阅读全文
摘要:以下瓶颈影响首页生成时间: 内存压力 缓存 CPU利用率 线程利用率 外部资源等待时间 如何查明瓶颈 内存 首先确定服务器是否耗尽了内存,如果是将会增加CPU使用率和磁盘I/O。因为,内存耗尽后,将会导致使用磁盘上的交换文件。因此,解决内存压力问题也能减少CPU和磁盘压力。 在命令行提示中运行perfmon,在性能监视器中增加Memory->Pages/sec计数器。这个计数器统...
阅读全文
摘要:ASP.NET站点性能提升系列内容来自《asp.net site performace secretes》。 使用瀑布图进行宏观分析 这里使用Firefox和Firebug生成瀑布图。 Firefox安装程序:http://www.mozilla.com/ Firebug安装程序:https://addons.mozilla.org/en-US/firefox/addon/1843/ 在Fire...
阅读全文
摘要:标准结构 SqlConnectionFactory中的Singleton模式:Double Check 版本:使用volatile关键字禁止编译器对代码进行优化。.NET平台特定实现:
阅读全文
摘要:标准结构 .net中通过实现ICloneable接口就可以实现Prototype模式。Clone可以实现浅拷贝和深拷贝。
阅读全文
摘要:标准结构 StringBuilder结构 StringBuilder中的Append方法提供了创建产品对象String的方法,可以多次调用这些方法。最后调用ToString()方法得到最终的产品。 在Builde模式中调用方不再是Client,而是Director,是因为Director可以决定调用Builder的哪一个BuildPart方法和调用次数。而在其它模式中的Client则没有这种自...
阅读全文
摘要:标准结构 Ado.NET的抽象工厂结构 抽象工厂基类DbProviderFactory,实现类SqlClientFactory、OracleClientFactory等。产品基类DbConnection、DbCommand、DbParameter等,实现类SqlConnection、OracleConnection等。伪码: public abstract class DbProviderFa...
阅读全文
摘要:标准结构: WebRequest结构: 在WebRequst中,不存在独立的Factory类,而是将创建方法做为产品基类的静态方法。这是一种工厂方法的常见变形。Create方法伪码: public abstract class WebRequest { public static WebRequest Create(string url) { if(url.BeginWith(“f...
阅读全文