PCclub社区:用户 密码 注册 www.pconline.cn 汽车网 游戏网 时尚女性
  太平洋电脑网
太平洋社区 产品论坛 软件论坛
咖 啡 馆 游戏论坛
首  页
产品库
今日报价 产业资讯
评 测 室 数码世界
软件 下载 摄影 论坛 
游戏 二手 视频 通信 图库
渠道商情 企  业 招聘培训
网络设备 服务器 办公设备
CPU/内显示器主板显卡
存储设备打印机外设MP4 
diy
DIY硬件
手机
手 机
笔记本
笔记本
台式机
台式机
数码相机
数码相机
随身听
随身听
摄像机
摄像机
数字家庭
数字家庭
精品廊
精品廊
北京 上海 广州 深圳 香港 广西 重庆 山东 江苏 辽宁 福建 成都 西安 台湾
   
   
首页 | 资讯 | 网络 | 系统 | 开发 | 其它 | 课程 | 考题下载 | 职场 | 找工作 | 找人才 | 服务指南
 
  认证专区: | Cisco | Microsoft | Sun | Oracle | IT设计 | 软件水平考试 |
 
您现在的位置: 招聘与培训 > 程序开发 > 其它开发认证 > 开发认证其它 免费新闻代码RSS新闻聚合
 
编写高性能Web应用程序的10个入门技巧
作者:莫文 责任编辑:lujiezhen

 

  数据层性能
  技巧 1 — 返回多个结果集
  技巧 2 — 分页的数据访问
  技巧 3 — 连接池
  技巧 4 — ASP.NET 缓存 API
  技巧 5 — 每请求缓存
  技巧 6 — 后台处理
  技巧 7 — 页输出缓存和代理服务器
  技巧 8 — 运行 IIS 6.0(只要用于内核缓存)
  技巧 9 — 使用 Gzip 压缩
  技巧 10 — 服务器控件视图状态
  

  使用 ASP.NET 编写 Web 应用程序的简单程度令人不敢相信。正因为如此简单,所以很多开发人员就不会花时间来设计其应用程序的结构,以获得更好的性能了。在本文中,我将讲述 10 个用于编写高性能 Web 应用程序的技巧。但是我并不会将这些建议仅局限于ASP.NET 应用程序,因为这些应用程序只是 Web 应用程序的一部分。本文不作为对 Web 应用程序进行性能调整的权威性指南 — 一整本书恐怕都无法轻松讲清楚这个问题。请将本文视作一个很好的起点。

  成为工作狂之前,我原来喜欢攀岩。在进行任何大型攀岩活动之前,我都会首先仔细查看指南中的路线,阅读以前游客提出的建议。但是,无论指南怎么好,您都需要真正的攀岩体验,然后才能尝试一个特别具有挑战性的攀登。与之相似,当您面临修复性能问题或者运行一个高吞吐量站点的问题时,您只能学习如何编写高性能 Web 应用程序。

  我的个人体验来自在 Microsoft 的 ASP.NET 部门作为基础架构程序经理的经验,在此期间我运行和管理 www.ASP.NET,帮助设计社区服务器的结构,社区服务器是几个著名ASP.NET 应用程序(组合到一个平台的 ASP.NET Forums、.Text 和 nGallery)。我确信有些曾经帮助过我的技巧对您肯定也会有所帮助。

  您应该考虑将应用程序分为几个逻辑层。您可能听说过 3 层(或者 n 层)物理体系结构一词。这些通常都是规定好的体系结构方式,将功能在进程和/或硬件之间进行了物理分离。当系统需要扩大时,可以很轻松地添加更多的硬件。但是会出现一个与进程和机器跳跃相关的性能下降,因此应该避免。所以,如果可能的话,请尽量在同一个应用程序中一起运行 ASP.NET 页及其相关组件。

  因为代码分离以及层之间的边界,所以使用 Web 服务或远程处理将会使得性能下降 20%甚至更多。

  数据层有点与众不同,因为通常情况下,最好具有专用于数据库的硬件。然而进程跳跃到数据库的成本依然很高,因此数据层的性能是您在优化代码时首先要考虑的问题。

  在深入应用程序的性能修复问题之前,请首先确保对应用程序进行剖析,以便找出具体的问题所在。主要性能计数器(如表示执行垃圾回收所需时间百分比的计数器)对于找出应用程序在哪些位置花费了其主要时间也非常有用。然而花费时间的位置通常非常不直观。

  本文讲述了两种类型的性能改善:大型优化(如使用 ASP.NET 缓存),和进行自身重复的小型优化。这些小型优化有时特别有意思。您对代码进行一点小小的更改,就会获得很多很多时间。使用大型优化,您可能会看到整体性能的较大飞跃。而使用小型优化时,对于某个特定请求可能只会节省几毫秒的时间,但是每天所有请求加起来,则可能会产生巨大的改善。

  数据层性能


  谈到应用程序的性能调整,有一个试纸性的测试可用来对工作进行优先级划分:代码是否访问数据库?如果是,频率是怎样的?请注意,这一相同测试也可应用于使用 Web 服务或远程处理的代码,但是本文对这些内容未做讲述。

  如果某个特定的代码路径中必需进行数据库请求,并且您认为要首先优化其他领域(如字符串操作),则请停止,然后执行这个试纸性测试。如果您的性能问题不是非常严重的话,最好花一些时间来优化一下与数据库、返回的数据量、进出数据库的往返频率相关的花费时间。

  了解这些常规信息之后,我们来看一下可能会有助于提高应用程序性能的十个技巧。首先,我要讲述可能会引起最大改观的更改。


  技巧 1 — 返回多个结果集


  仔细查看您的数据库代码,看是否存在多次进入数据库的请求路径。每个这样的往返都会降低应用程序可以提供的每秒请求数量。通过在一个数据库请求中返回多个结果集,可以节省与数据库进行通信所需的总时间长度。同时因为减少了数据库服务器管理请求的工作,还会使得系统伸缩性更强。

  虽然可以使用动态 SQL 返回多个结果集,但是我首选使用存储过程。关于业务逻辑是否应该驻留于存储过程的问题还存在一些争议,但是我认为,如果存储过程中的逻辑可以约束返回数据的话(缩小数据集的大小、缩短网络上所花费时间,不必筛选逻辑层的数据),则应赞成这样做。

  使用 SqlCommand 实例及其 ExecuteReader 方法填充强类型的业务类时,可以通过调用NextResult 将结果集指针向前移动。图 1 显示了使用类型类填充几个 ArrayList 的示例会话。只从数据库返回您需要的数据将进一步减少服务器上的内存分配。

  Figure 1 Extracting Multiple Resultsets from a DataReader
  // read the first resultset
  reader = command.ExecuteReader();

  // read the data from that resultset
  while (reader.Read()) {
  suppliers.Add(PopulateSupplierFromIDataReader( reader ));
  }

  // read the next resultset
  reader.NextResult();

  // read the data from that second resultset
  while (reader.Read()) {
  products.Add(PopulateProductFromIDataReader( reader ));
  }


  技巧 2 — 分页的数据访问


  ASP.NET DataGrid 具有一个很好的功能:数据分页支持。在 DataGrid 中启用分页时,一次会显示固定数量的记录。另外,在 DataGrid 的底部还会显示分页 UI,以便在记录之间进行导航。该分页 UI 使您能够在所显示的数据之间向前和向后导航,并且一次显示固定数量的记录。

  还有一个小小的波折。使用 DataGrid 的分页需要所有数据均与网格进行绑定。例如,您的数据层需要返回所有数据,那么 DataGrid 就会基于当前页筛选显示的所有记录。如果通过 DataGrid 进行分页时返回了 100,000 个记录,那么针对每个请求会放弃 99,975 个记录(假设每页大小为 25 个记录)。当记录的数量不断增加时,应用程序的性能就会受到影响,因为针对每个请求必须发送越来越多的数据。

  要编写性能更好的分页代码,一个极佳的方式是使用存储过程。图 2 显示了针对Northwind 数据库中的 Orders 表进行分页的一个示例存储过程。简而言之,您此时要做的只是传递页索引和页大小。然后就会计算合适的结果集,并将其返回。

  Figure 2 Paging Through the Orders Table
  CREATE PROCEDURE northwind_OrdersPaged
  (
  @PageIndex int,
  @PageSize int
  )
  AS
  BEGIN
  DECLARE @PageLowerBound int
  DECLARE @PageUpperBound int
  DECLARE @RowsToReturn int

  -- First set the rowcount
  SET @RowsToReturn = @PageSize * (@PageIndex + 1)
  SET ROWCOUNT @RowsToReturn

  -- Set the page bounds
  SET @PageLowerBound = @PageSize * @PageIndex
  SET @PageUpperBound = @PageLowerBound + @PageSize + 1

  -- Create a temp table to store the select results
  CREATE TABLE #PageIndex
  (
  IndexId int IDENTITY (1, 1) NOT NULL,
  OrderID int
  )

  -- Insert into the temp table
  INSERT INTO #PageIndex (OrderID)
  SELECT
  OrderID
  FROM
  Orders
  ORDER BY
  OrderID DESC

  -- Return total count
  SELECT COUNT(OrderID) FROM Orders

  -- Return paged results
  SELECT
  O.*
  FROM
  Orders O,
  #PageIndex PageIndex
  WHERE
  O.OrderID = PageIndex.OrderID AND
  PageIndex.IndexID > @PageLowerBound AND
  PageIndex.IndexID < @PageUpperBound
  ORDER BY
  PageIndex.IndexID

  END


  在社区服务器中,我们编写了一个分页服务器控件,以完成所有的数据分页。您将会看到,我使用的就是技巧 1 中讨论的理念,从一个存储过程返回两个结果集:记录的总数和请求的数据。

  返回记录的总数可能会根据所执行查询的不同而有所变化。例如,WHERE 子句可用来约束返回的数据。为了计算在分页 UI 中显示的总页数,必须了解要返回记录的总数。例如,如果总共有 1,000,000 条记录,并且要使用一个 WHERE 子句将其筛选为 1000 条记录,那么分页逻辑就需要了解记录的总数才能正确呈现分页 UI。


[1] [2] [3] [4] [下一页]
更多相关搜索: Web应用程序    Web开发   

 
本栏今日更新
相关文章
 
·咱为啥是穷人?看穷人富人的绝对区别!
·我眼中的中国民营企业的人力资源现状
·中国企业管理中四大怪现象
·上海信息炸弹事件:领导偷看员工聊天记录
·截止至2006年10月1日全球CCIE人数统计
·一个文科大学生的深圳求职经历
·一个大学生的民工血泪史
·程序员三部曲之三----不作浮躁的程序员
·web应用程序测试方法和测试技术详述
·WEB应用开发之我见(图)
·提高DB2 Web应用程序性能的五条规则

  发给好友 我要报错 投稿给我们 加入收藏 返回顶部  
 
关于我们 | 网站地图 | 广告指南 | 联系我们 | 招聘精英 | 合作联系


广东省通信管理局
ICP证粤B2-20040647
互联网清理整顿
技术支持与报障:support@pconline.com.cn
        020-87568837         
对本站有任何建议、意见或投诉,请点这里在线提交.
本网站简体、繁体两种版本,以简体版为准
PConline版权所有,未经授权禁止转载、摘编、复制或建立镜像.如有违反,追究法律责任__