没有合适的资源?快使用搜索试试~ 我知道了~
编写高性能Web应用程序的10个入门技巧.doc
0 下载量 50 浏览量
2022-11-29
08:09:42
上传
评论
收藏 69KB DOC 举报
温馨提示
试读
14页
编写高性能Web应用程序的10个入门技巧.doc
资源推荐
资源详情
资源评论
使用 ASP.NET 编写 Web 应用程序的简单程度令人不敢相信。正因为如此简单,所
以很多开发人员就不会花时间来设计其应用程序的结构,以获得更好的性能了。在本文中,
我将讲述 10 个用于编写高性能 Web 应用程序的技巧。但是我并不会将这些建议仅局限于
ASP.NET 应用程序,因为这些应用程序只是 Web 应用程序的一部分。本文不作为对 Web
应用程序进行性能调整的权威性指南 — 一整本书恐怕都无法轻松讲清楚这个问题。请将本
文视作一个很好的起点。
成为工作狂之前,我原来喜欢攀岩。在进行任何大型攀岩活动之前,我都会首先
仔细查看指南中的路线,阅读以前游客提出的建议。但是,无论指南怎么好,您都需要真正
的攀岩体验,然后才能尝试一个特别具有挑战性的攀登。与之相似,当您面临修复性能问题
或者运行一个高吞吐量站点的问题时,您只能学习如何编写高性能 Web 应用程序。
我的个人体验来自在 Microsoft 的 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
剩余13页未读,继续阅读
资源评论
yyyyyyhhh222
- 粉丝: 404
- 资源: 6万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 论文(最终)_20240430235101.pdf
- 基于python编写的Keras深度学习框架开发,利用卷积神经网络CNN,快速识别图片并进行分类
- 最全空间计量实证方法(空间杜宾模型和检验以及结果解释文档).txt
- 5uonly.apk
- 蓝桥杯Python组的历年真题
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 前端开发技术实验报告:内含4四实验&实验报告
- Highlight Plus v20.0.1
- 林周瑜-论文.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功