BizStruct - 商业架构

基于架构的富界面 Web 应用的可视化快速开发平台 www.BizStruct.cn

博客园 首页 新随笔 联系 订阅 管理
  5 Posts :: 0 Stories :: 97 Comments :: 0 Trackbacks
    有的时候我们的 Web 应用程序在本机测试的时候,速度很快,可放在局域网上测试的时候,却会发现存在性能问题;甚至有时在局域网速度正常的应用,在广域网上还会发现问题。这些问题一般都是应用中的疏忽或错误,并不涉及到系统架构,通过真实环境的调试和测试都能找到问题所在并解决。
    今天我们所要说的是通过改善架构来从根本上提高 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,每个人选择开发工具的时候,都会自己均衡的。

posted on 2006-05-15 14:59 BizStruct 阅读(1544) 评论(14) 编辑 收藏

Feedback

#1楼 2006-05-15 15:20 kiler      
有的时候我们的 Web 应用程序在本机测试的时候,速度很快,可放在局域网上测试的时候,却会发现存在性能问题;
这个很有可能是你的asp.net生成html页面体积太大了,在本机根本看不到这个问题的。
这样在客户端通过 DOM 或 XSLT 将数据展现为表格,来代替服务器端 DataGrid 的绑定工作,大大减轻了服务器的压力。
这样的话,要写很多客户端的代码了,比较麻烦,其实要提高系统性能很简单,分页读取数据显示就可以了,返回的数据减少了,服务器的压力就减轻了。

 回复 引用 查看   

#2楼[楼主] 2006-05-15 15:27 BizStruct      
@kiler
这种问题可能性很多,不一定是应用程序的性能问题,比如 Internet 上的托管主机,自己无法设置权限,如果为了阻止客户端下载,而放到 bin 目录下,就会带来性能问题。如此等等。

 回复 引用 查看   

#3楼 2006-05-15 16:16 Boler Guo      
"在客户端通过 DOM 或 XSLT 将数据展现为表格,来代替了服务器端 DataGrid 的绑定工作"
--会导致开发、维护成本加大,可能比买新Server、加内存成本还大!

 回复 引用 查看   

#4楼 2006-05-15 16:23 swz[未注册用户]
不知道能說明什么???
 回复 引用   

#5楼[楼主] 2006-05-15 17:22 BizStruct      
@Boler Guo
一个好的架构,不仅仅能提高性能,还能提高开发效率和可维护性;

 回复 引用 查看   

#6楼[楼主] 2006-05-15 17:23 BizStruct      
@swz
对于 ASP.Net 开发方式,还是有提高的空间的。

 回复 引用 查看   

#7楼 2006-05-15 21:46 Riancy[未注册用户]
楼主下一篇是不是要写具体怎么实现了?
 回复 引用   

#8楼 2006-05-15 23:15 風語者·疾風      
老实说,我认为PHP是效率最高的.干脆我们都改用PHP体系吧.
 回复 引用 查看   

#9楼 2006-05-15 23:41 双鱼座      
楼主说的在客户端绑定应该是通过ajax或者其它xml数据岛技术用javascript将数据写到html的table中。虽然我尝试过使用这种方式,但是我不认为这种方式会有比较好的用户体验。
我的作法是:在服务端第一次访问的时候整理好分页情况(这个耗时非常短),然后每次只从数据库读出一页数据并绑定到UI上。这样当然就不能用UI的分页功能了(因为分页只能通过GET实现了),但是决不会出现性能方面的问题。

 回复 引用 查看   

#10楼 2006-05-16 00:33 维生素C.NET      
当数据量非常非常大的时候,像MySpace, MSN Spaces, Google等,单单这样做也不是能提高效率的办法了(效率提升幅度比较小了)
另外,楼主最后的连接地址不对,加上http://吧 :-)

 回复 引用 查看   

#11楼 2006-05-16 08:45 极地银狐.NET      
要提高性能,还应该理解.NET的深层运作.
 回复 引用 查看   

#12楼 2006-05-16 16:51 WaitU@...      
一直在用.NET,但也用过PHP
我不认为PHP的开发效率就比ASP.Net低。
多说无益。。。

 回复 引用 查看   

#13楼 2006-05-17 11:12 henry      
Web应用程序 用产品表填充DataSet,并绑定 DataGrid 70次 28% 72%
可以看到asp.net用于解释占用一大部分资源,楼主是把UI表现这部分搬到各自的客户端去做来减少服务器的解释工作.
楼主是否有关心过代码是否有问题?对于性能优化已有代码应该首要优化的问题.

如果是我会选择dbserver-appserver-webserver的部署方式,对各自的代码进行优化,因为现在项目中UI方面的代码差不多占了项目的一半代码,改变UI的表现方式工作量实在是太大了这些成本说不定比几台appserver的代价还高。


 回复 引用 查看   

#14楼 2006-05-18 09:37 abc111[未注册用户]
所谓的效率应该至少考虑到时间与空间这两个因素
在web2.0中,将面临javascript的性能,资源分配\管理方式能否胜任客户端越来越多的复杂设计问题,谁能保证客户端的一个轻松,干净的环境
另一问题是,现在基于http的传输方式将会限制传输速度,而传输文本的速度快于其它的对象,且它的压缩率也挺乐观的.
谁都想从本质上完善web的基础建设?

 回复 引用