如何开发高性能的Web应用程序,是程序员和用户都希望得到的效果,性能问题是一个综合问题,如今普遍开发的web应用程序都会涉及到各种技术点,各种算法、设计模式、架构、数据库技术,因此性能的优化必然也是一个综合的方法。
我们知道
不同的SQL 语句得到相同的一个结果,数据库所用的查询时间可以相差10倍甚至100倍以上;
一个有策略性的缓存可以减少成千上万次重复的数据库访问;
我们专注于数据库SQL 语句本身查询计划的时候,策略性的设计冗余字段 或 分开计算部分结果,甚至可以使查询的时间缩短到原来的1/100;
......
性能的优化是一个综合的方法,任何的技巧都是针对特定场景的优化,同时也可能带来另一方面的负面影响,因此我们开发高性能的WEB应用程序的时候,也需要针对特定场景选择特定的技巧。E8.Net的客户在开发高性能的Web应用程序的时候用到了各种优化技巧,主要技巧总结如下:
1、Sql 依赖缓存:
.Net Framework 2.0提供了Sql 依赖缓存的技术,这个技术可以使很多所有用户读到相同结果的数据,改为从内存中读取,减少数据库访问的次数,降低数据库CPU的压力,但会提高Web服务器的一些压力,和增加少量的内存占用量。
应用场景主要针对一些基础数据、组织结构数据等的访问,E8.Net提供了实现这一方法的一个公共组件,包含全部源码
详情:http://www.cnblogs.com/cancanwyq/archive/2008/02/14/1068605.html
2、页面缓存、控件缓存的技巧
对于所有用户得到相同页面结果的页面来说,可以采用页面缓存的方式,比如我们在首页上展示公告信息的结果,这些结果对于所有用户来说是一样的,可以采用页面缓存的方式,同时通过设置页面缓存的失效机制保证所有用户得到最新的结果,比如后台代码增加新的公告内容时可以设置一个Application的值,告诉页面缓存失效。
参考代码如下:
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(!IsPostBack)
{
Response.Cache.AddValidationCallback(new HttpCacheValidateHandler(Validate),null);
}
}
public void Validate(HttpContext context, Object data, ref HttpValidationStatus status)
{
object obj=Application["ISCacheValid"];
bool isV=true;
if(obj!=null)
{
isV=false;
}
if(isV)
{
status=HttpValidationStatus.Valid;
}
else
{
status=HttpValidationStatus.Invalid;
try
{
Application.Lock();
Application.Remove("ISCacheValid");
}
finally
{
Application.UnLock();
}
}
}
主要技巧是通过 Response.Cache.AddValidationCallback(new HttpCacheValidateHandler(Validate),null); 回调的技巧提供缓存判断机制,在异步更改内容的时候设置了 Application["IsCacheValid"]的值,这样达到一个即可以读取缓存减少系统压力 同时又能保证所有数据都是最新的内容。
注意的是,虽然.NET提供了可以根据参数不同来缓存,但这样对内存的占用增加非常大,建议谨慎使用
3、关闭不必要的ViewState
在.net提交后台处理时不需要的控件和数据可以关闭ViewState这样可以大大减少页面的大小,提高网络流量的数据,比如一个部门树的控件,加载了一个大集团的组织结构的话,关闭 ViewState后深圳可以将页面大小变为以前的1/10,让用户体验更加流畅。
4、智能的静态页面处理技巧
一些已经处理完成的页面展示的时候,系统已经不再有交互的动作,对于用户来说,仅仅只是查看结果的情况下,可以智能的生成静态页面文件,只有一个用户是通过.NET计算去获得展示,其它用户访问的则是生成的静态页面,这样也可以减少非常大数据量的.NET计算,提高性能。比如E8.Net工作流平台中展示流程结束后的结果就有客户使用到了这些技巧,大大减少了服务器的压力。
详情:http://www.cnblogs.com/cancanwyq/archive/2008/02/22/1077174.html
这样做也有一些负面的影响,比如万一还有后续的交互动作的话就无法处理了,同时也增加了硬盘的存储压力,加大了一些关键信息被流氓软件收录并从互联网搜到的风险。
5、静态变量的方法
如果仅仅只对于一个简单变量来说,静态变量的方法对于优化来说可以认为是很微小的,但我们的应用程序中往往用到了各种设计模式,比如工厂模式,一些具体实现的对象是通过反射机制动态加载的。这个时候,我们用静态变量的方法,再结合一些可系列化的存储机制,可以使动态加载的动作只执行一次,这样对性能的提升也是非常大的。
详情:http://www.cnblogs.com/cancanwyq/archive/2008/03/27/1124711.html
6、通过Cache机制缓存 配置信息 、系统参数
一些配置文件 系统参数等内容可以通过 Cache缓存,这样我们的系统不必要从数据库中读取,而是直接读取内存,也可以大大提高应用程序的性能。
详情: http://www.cnblogs.com/cancanwyq/archive/2008/08/02/1258608.html
......
提高性能的技巧还有非常多,关键是我们要针对特定的场景采用特定的技巧。 程序写得多了自然能找到更多更好的方法。
C#语言 就像是音乐中的7个音符,要奏出美妙的音乐需要日积月累的经验积累和刻苦的练习,及对代码的感觉。希望本文能对大家有所启发!