今天我们所要说的是通过改善架构来从根本上提高 ASP.Net 应用程序的性能。
我们先来对 ASP.Net 的几个简单的应用做一下测试。
测试环境:AthlonXP 3200+,DDR400 512M,WindowsXP SP2,本机的SQL Server 2000,中文 Northwind 数据库(从Access导入)的产品表,约70条记录。
测试序号 | 程序类型 | 测试方法 | 测试结果 (每秒请求数) |
SQLServer 所占用资源 |
ASP.Net 所占用资源 |
1 | Web服务 | 用产品表填充DataSet,并返回记录数 | 250次 | 100% | - |
2 | Web服务 | 用产品表填充DataSet,并返回 DataSet | 138次 | 54% | 46% |
3 | Web应用程序 | 用产品表填充DataSet,并绑定 DataGrid | 70次 | 28% | 72% |
说明:不同系统的测试结果可能不同,但测试结果的相对比例应该差别不大。
在第一个测试里,Web 服务只是从数据库读取记录填充到 DataSet,并返回记录数(注意不是返回记录),所占用的系统资源很少,假设系统资源完全被SQLServer 占用,并且对结论不会有负面影响。
在第二个测试中,Web 服务将 DataSet 返回,每秒请求数就降低了几乎一半, 这一半的系统资源,被ASP.Net 用于将 DataSet 序列化。
在第三个测试中,Web 应用程序将 DataSet 绑定到 DataGrid,并返回页面,每秒请求数几乎降低了四分之三,这些系统资源被 ASP.Net 用于将 DataSet 绑定到 DataGrid,并将页面序列化。
从以上测试中我们可以看到,DataGrid 的绑定和序列化会占用大量的系统资源,如果要提高系统性能,需要通过改善架构来实现。
一、将对数据库的操作,从页面中分离出来,放到独立的持久层。
这样在客户端通过 DOM 或 XSLT 将数据展现为表格,来代替服务器端 DataGrid 的绑定工作,大大减轻了服务器的压力。并且客户端通过 AJAX 从持久层获取数据,会提高用户的使用体验。
二、将页面从数据中彻底独立出来,以便利用缓存。
有的应用了 AJAX 的页面还是会读取初始数据,这样的话页面就不能缓存。这些页面一般比较复杂,会比普通页面占有更多的资源,如果能够利用缓存,将进一步提高系统的性能。
通过以上两点,ASP.Net 的性能,几乎能够提高一倍。
您可以自己作一下测试,或者访问我们的示例 www.BizStruct.cn。
以下是对本文档的一个说明,及对回复的答复。
我们开发这个架构的本意是提高用户的体验和开发的效率,在开发完成后进行性能测试的时候才发现这个架构对性能有很大的提高,本来还担心对性能有负面影响的,也算无心插柳。写本文的目的是和大家分享自己的发现,很多人可能和我原来一样,没想到测试结果会是这样的。
@kiler
分页读取数据显示是最基本的要求,而我们所说的改善是更进一步的,即使分了页,还是能大大提高性能的。
@Boler Guo
一个好的架构,不仅仅能提高性能,还能提高开发效率和可维护性;
@维生素C.NET
我所说的架构对性能的提高,与数据量是无关的,因为不论数据量大小,不同步骤占用资源的比例是不变的。通过架构可以减少步骤,从而提高性能。
@双鱼座
每个系统规模不一样,对性能要求都是不一样的,你的系统没有性能问题当然好;单就你的描述,这个架构还是能大大提高性能的,当然对你的系统可能不需要。
还有 AJAX 带来的客户体验的提高,我看过很多系统都做得很好,不知道为什么你不认可,你可以看看我们的演示,不知道会不会对 AJAX 有一个新的认识。
@极地银狐.NET
这位老兄说的太虚,我倒觉得有些东西了解的再深还不如做做测试,测试以前没有想到仅仅是序列化,ASP.Net 就要占用那么多资源。
@風語者·疾風
每个工具都有他的优势,PHP性能可能很高,但至少他的开发效率比不过ASP.Net,每个人选择开发工具的时候,都会自己均衡的。