1、dorado 5 性能指南 V1.1第 1 页共 69 页dorado 5 性能指南V1.1BSTEK2007 年 1 月dorado 5 性能指南 V1.1第 2 页共 69 页文档信息文档中文名称 dorado5 性能指南文档英文名称 dorado5 performance Guide文档内容简介 讨论基于 dorado5 的应用系统性能优化的高级技术文档。日期 作者 版本 变更说明2007 年 1 月 26日Benny V1.0 创建2007 年 1 月 26日Thomas V1.1 版面调整dorado 5 性能指南 V1.1第 3 页共 69 页内容目录1 概述 .52 系统设计和分
2、析 .62.1 确定设计目标 .62.2 避免不合理的设计 .82.3 Dorado 页面的初始化过程 .92.4 GZIP 压缩 .112.5 客户端缓存 .122.6 实例与参考数据 .142.6.1 网页大小与响应速度的关系 .142.6.2 初始化耗时与 CPU 的关系 .152.6.3 网页复杂度与网页大小的关系 .152.6.4 实例分析 .172.7 调整开发规范 .183 开发技巧 .193.1 发掘性能隐患 .193.1.1 通过观察现象来定位 .193.1.2 利用 Dorado 的 Debugger 功能 .223.1.3 检查页面大小 .243.1.4 消灭垃圾数据和对
3、象 .253.2 数据库相关 .263.2.1 选择高效的 JOIN 方式 .263.2.2 配置正确的数据库方言 .283.2.3 使用分页查询 .293.2.4 精简非必要的字段 .293.3 Dorado 的服务端技巧 .303.3.1 把业务逻辑代码留在服务端 .303.3.2 避免 LookupField 的过度使用 .333.3.3 用好 ViewModel 的实现类 .353.3.4 正确的使用 EL 表达式 .373.4 Dorado 的客户端技巧 .383.4.1 利用布局技巧改善操作体验 .383.4.2 哪些逻辑代码应该放在 onDatasetsPrepared 事件中
4、.393.4.3 如何遍历 Dataset .403.4.4 disableControls()和 enableControls() .413.4.5 disableEvent()和 enableEvent() .443.4.6 警惕主从绑定带来的连锁反应 .453.4.7 利用 dataset 的 autoLoadPage 属性改善操作体验 .503.4.8 为部分下拉框热身 .513.4.9 谨慎使用下拉框的 mapValue 特性 .523.4.10 通过 copyRecord()复制记录 .53dorado 5 性能指南 V1.1第 4 页共 69 页3.4.11 利用 insertR
5、ecords()批量添加数据 .533.4.12 提高查找记录的效率 .553.4.13 使用异步操作 .563.4.14 利用 UpdateCommand 的数据感知特性减少 flushData().583.5 其他客户端技巧 .613.5.1 利用 setTimeout()、clearTimeout()减少调用次数 .613.5.2 检查 IE 内存泄露 .623.5.3 如何利用 JavaScript 代码生成界面元素 .633.5.4 innerText 和 innerHTML .653.5.5 如何高效的拼装字符串 .653.5.6 把自定义的 JavaScript 放入到包含文件中
6、 .674 部署和维护 .67图表目录图表 1BySoft Network Monitor .7图表 2BWMeter.7图表 3GroupBox.10图表 4SubWindow .10图表 5OutlookBar .11图表 6 状态 1.20图表 7 状态 2.20dorado 5 性能指南 V1.1第 5 页共 69 页dorado 5 性能指南1 概述本文主要讨论在使用 Dorado 的过程需要注意的一些与性能相关的要点和技巧,其中也会涉及到小部分 Dorado 之外的知识,如 HTTP、Java、SQL 等。一般而言,当 Web 应用的性能出现问题时,可能与 Dorado 的使用方式
7、相关外部资源的主要有 5 点,按照的他们对于整体性能影响的关键程度排列如下: 数据库 数据库服务器的负荷过高可能是由于低效的 SQL 引起的;或者是由于应用当中的运算逻辑设计不当,导致数据库被频繁访问或死锁。可能导致的响应速度差异:10 倍数量级出现的几率:高 客户机 CPU 由于 Dorado 的客户端主要通过 HTML+JavaScript 构建,因此Dorado 应用的界面相应速度与客户机 CPU 的运算能力直接相关。并且由于JavaScript 本身是一种“解释型”的语言,不同的编程技巧可能导致迥然不同的性能表现。可能导致的响应速度差异:10 倍数量级出现的几率:较高 网络带宽 当客户
8、端页面的界面设计不够合理时,例如在单个页面中堆放了过多的组件;包含了大量不可缓存的 JavaScript;未被清理的垃圾数据都有可能造成单个页面的体积过大,从而导致网络传输环节的性能瓶颈。可能导致的响应速度差异:2 倍数量级出现的几率:较高 服务器内存 当 Dorado 中的部分环节设计的不够合理时可能导致对服务器内存的过程使用,最终造成 JVM 频繁的执行垃圾回收甚至停止响应。可能导致的响应速度差异:2 倍数量级出现的几率:一般 服务器 CPU 服务器 CPU 的负荷过高可能是由于低效的算法或不良的编程习惯导致的。可能导致的响应速度差异:2 倍数量级出现的几率:一般dorado 5 性能指南
9、 V1.1第 6 页共 69 页由于 Web 应用的性能优化是一个很大的课题,而本文的讨论重点是 Dorado 的使用技巧,因此对于其中的部分内容只会做简要的叙述。要了解更多关于 Dorado 之外性能优化细节请参考下列文献: Oracle performance tuning Effective Java Web 性能优化2 系统设计和分析2.1 确定设计目标在开始着手规划应用之前,首先应该了解一下应用最终的运行环境。系统的最终响应时间往往是这样构成的:服务端处理的耗时 + 网络传输的耗时 + 客户端处理的耗时。因此,影响响应时间的关键因此应该包括以下 6 点。 用户对系统响应速度的敏感程度
10、不同的用户对于系统响应时间的忍耐极限是不同的,甚至是在同一个系统中用于对不同功能的忍耐极限也是不一样的。这主要跟用户是否需要频繁的使用某功能相关。对于那些不常用的界面,例如每月才操作一次的报表或查询类界面而言,用户完全可以为它等上半分钟而没有任何怨言;可是对于那些每天要点击上百次的提交按钮,即使是 3 秒钟的延时他也无法忍受。开发人员需要根据与用户的交流和自己的经验来确定那些常用功能的最大响应时间,这一点甚至应该写进需求设计文档,强迫开发人员在开发时对各个功能点的响应时间进行基本的测试。尽管在开发阶段得到的测试结果很有可能跟最终应用上线时的结果存在差异,但这样做仍可以避免相当一部分性能问题的出
11、现,特别是那些由客户端导致的性能问题。 在线用户数量需要掌握将来有多少用户可能同时在线使用系统、某些最常用的功能有多少在线用户。在分析网络因素对响应速度的影响时,在线用户的数量是一个非常关键的指标。同时,在线用户数量对于将来的如何进行压力测试也有着指标性的意义。在进行性能测试时我们常常会提到一个并发用户数的概念,需要特别注意的是并发用户与在线用户是完全不同的概念。一般而言,我们习惯以 20-50 的比率来推算并发用户与在线用户之间的关系。例如:当系统存在 2000 个在线用户时,测试时可以以 40-100 个并发用户作为测试基准。 网络状况了解服务器与客户机之间的网络带宽、带宽的分配方式、各服
12、务器之间的连接状况。一般而言,我们需要结合在线用户数量来做一个综合的分析,以此推测出单个用户可使用的实际带宽。dorado 5 性能指南 V1.1第 7 页共 69 页有时,我们很难通过主观判断来确定用户实际享用的网络带宽,或者即使我们通过分析得到了一个数值,它也有可能与实际情况有所差异。那么这时利用专业的网络监视工具来进行测试才是更加务实的做法。可选择的工具有:BySoft Network Monitor 这是一个完全免费但有点简陋的小工具,可以用于检测网络实际带宽、上行和下行的流量等。图表 1BySoft Network MonitorBWMeter(http:/ 是一个非常专业的网络监视
13、分析工具。利用 BWMeter 可以完成很多有关网络带宽的测试和分析。我们甚至可以用它来限制网络带宽,以便测试在低带宽下应用的响应速度。图表 2BWMeter 客户端的硬件配置此处的客户端的硬件配置注意是指客户机的 CPU。与传统的 BS 应用不同,基于Dorado 的应用的界面响应速度与客户机的 CPU 运算能力有着直接的关系。由于dorado 5 性能指南 V1.1第 8 页共 69 页浏览器中的主要运算量来自于解析 HTML/XML 以及执行 JavaScript,并且一般而言,浏览器本身所耗用的内存不会超过 100M,因此界面响应速度与客户机的内存和硬盘等的配置基本无关。CPU 的运算
14、速度与界面响应速度(特指纯客户端运算)之间是线性相关的。按照推测,P4 1.8 的系统的处理时间基本是 P4 3.6 系统的一倍。 服务器的硬件配置服务器的运算能力和 IO 吞吐量可能直接影响到应用系统最终的响应速度和最大并发量。不过一般而言,服务器的运算能力不是影响表现层响应速度的最关键因素。 客户端的软件配置这里主要是指浏览器的版本和种类。目前主流的浏览器大都只有 IE 和 Mozilla 两种核心,其中 IE 又占有绝大部分的市场份额。想常见的MyIE、Mathon、GreenBrowser、腾讯等都是以 IE 作为核心的。而FireFox、NetScape 是以 Mozilla 作为核
15、心的。这些浏览器的性能各不相同,主要由使用的核心决定。以 IE7 的核心为参照依据,假设一个 Dorado 网页在IE7 中打开需耗时 1 秒(此处不考虑网络传输的时间) 。他们之间的性能对比情况大致如下:浏览器核心 耗时(秒)IE 7 1.0Mozilla 1.4IE 6 1.6由此可见,最新推出的 IE7 有着较明显的性能优势,特别是相对与 IE6 而言。另外,在目前的网络环境中各种浏览器插件、工具栏、流氓软件也是一个不个忽略的因素。在大部分的客户机系统中或多或少的都会安装一些插件。这些插件的品质良莠不齐,有些会导致浏览器的运行速度极具低下,甚至一些带有JavaScript 拦截功能的插件
16、还会阻止 Dorado 页面的正常运行。对于这一点,我们目前还没有有效的解决办法,因为有些流氓软件像病毒一样难以卸载,有时可能不得不重新安装系统才能让浏览器恢复工作。或许随着像瑞星卡卡之类的“流氓软件查杀工具”的逐渐成熟,此问题会逐步得到缓解。2.2 避免不合理的设计性能问题的发生并不总是与技术和技巧相关。事实上,现实中碰到的相当多的性能问题并不是开发人员的问题导致的。最常见的设计问题表现为以下两个方面: 在单个页面中堆砌过多的控件和逻辑。dorado 5 性能指南 V1.1第 9 页共 69 页 提出一些对于 BS 应用而言难以实现的功能要求,最终导致开发人员使用不合理的实现方式。造成这种设
17、计问题的主要原因往往是来自与设计人员不能很好的区分 CS 应用与 BS应用的不同点。尤其是对于那些从事了多年 CS 应用开发的设计人员而言,这个问题往往更加突出。由于 dorado 的出现使得 Web 客户端的开发变得越来越简单、功能越来越强劲。于是很多设计人员开始将越来越多的 CS 界面的设计模式照搬到 BS 应用当中。这其中最常见的大概就是多页标签式的界面了。对于部分复杂的界面还会出现多页标签的嵌套使用。为了编程方便这些标签中的内容往往都是直接放置在一个网页当中。这样,单个网页的尺寸就有可能超过 300K。如下图:CS 应用与 BS 应用的运行环境和机制存在着巨大的差异,在表现层体现的尤为
18、明显。Web 界面毕竟不同于 CS 应用的界面,它的执行速度与 CS 应用不可相提并论。尽管这样设计的界面在操作效率可能确实高于传统的 BS 应用界面,但是在界面初次打开这个环节上的响应速度肯定是大大的降低了。用户可能无法充分感觉到整体效率的提高。相反,他们会觉得界面的响应速度变慢了。虽然 Dorado 在性能方面已经做了很多优化,但无论如何,他都不能改变 BS 应用的本质,不能逾越 BS 应用的诸多限制。因此,认为有了 Dorado 就可以完全按照 CS应用界面风格和操作风格来开发 BS 应用的想法是完全不可取的。尽管新型的表现层框架允许我们将客户端界面设计的更加复杂。但是,考虑到浏览器的运
19、行速度和网络带宽等因素。我们仍然应当在重构界面时把握好复杂度的分寸。根据经验我们大致划定了一个复杂度的警戒线,当您发的自己设计页面可能已经逾越了这条线时,那就是时候考虑一下应该如何重新规划你的设计了。 编辑框总数超过 300 个。 标签页总数超过 10 个。 数据表格数超过 8 个。 单个表格中的列数超过 100 个(这样的表格一定很难用) 。 以上条件中有任意 3 个您已经越过了警戒线的一半。2.3 Dorado 页面的初始化过程Dorado 页面的初始化过程大致包括下面的一些环节(从主页面下载完毕后开始):1) 浏览器解析 HTML 和 XML2) Dorado 客户端引擎构建页面中所有的
20、 Dataset(数据集)3) 构建页面中所有的非可视化控件(包括下拉框、命令对象、菜单) 。dorado 5 性能指南 V1.1第 10 页共 69 页4) 构建页面中可视化控件的可见区域。5) 刷新已构建好的数据敏感控件(数据敏感控件都是可视化控件) ,以便正确显示出Dataset 中的数据。上述五个步骤当中,前三个步骤中没有什么需要特别注意的要点,并且他们也不是初始化过程中最耗时的部分。第四个步骤是需要我们好好理解的,它对于如何设计高效的页面有着重要的意义。Dorado 并不是向我们想象的那样,会在初始化阶段就把所有的可视化控件都构建起来。对于部分在页面乍一打开时肯定不会显示出来的控件,
21、Dorado 是不会去处理的。只要当用户进行某些操作时,需要显示某个控件了,Dorado 引擎才会去处理它。以下面的 TabSet(多页标签)控件为例:在页面的过程中,Dorado 引擎只会初始化 “员工信息维护 ”中的可视化控件,而跳过其它两个标签页中的控件。当用户点击“部门信息维护”时,Dorado 引擎会标签页切换之前初始化好“部门信息维护”中所有的可视化对象。尚未被初始化过的Dorado 控件,处于不可用的状态。如果此时通过 JavaScript 代码调用“分公司信息维护”中某个编辑框的方法,很有可能会得到错误提示。Dorado 中除了 TabSet(多页标签)由此特性之外,GroupBox、SubWindow 、 OutlookBar 也都具有这样的特性。图表 3GroupBox图表 4SubWindow