Domino 6 应用程序性能优化指南(第二部分) |
| 级别: 初级 2003 年 5 月 01 日 在应用程序性能优化的 第一部分中,我们讨论了将影响应用程序性能的数据库、视图和表单属性。现在,您可能启用或禁用了某些属性并看到了某些改进。但您可以做更多的事情来提升应用程序的性能。在第二部分,我们讨论可以运行的程序代码方案。我们还测试一些通用的LotusScript方法,了解在不同的情形下哪些将以最佳性能运行。本文假设您是一位富有经验的熟悉LotusScript 的Notes/Domino应用程序开发人员。 前台/后台编程
后台程序是在后台运行的程序。这包括预定的代理,它不时成为与系统性能相关的故障的来源。例如,您可能拥有一个清除数据库保存/复制冲突的预定的代理,您可能发现该代理在不正常的时间范围内完成其任务,或者它消耗大量紊乱的系统资源来完成这一项任务。要测试后台程序,审视您的日志是否异常,如完成一项任务的长时间流逝。如果您正在测试的后台程序是代理,检查代理日志,查看代理是如何很好地完成其任务的。 现在,我们区分了前台程序和后台程序,那么我们讨论一些影响这两者性能的常见程序错误。
临时变量
另一个典型例子是拥有大量数据和用户的文档,用户可以通过点击按钮,以不同的方式对数据进行排序。这种功能旨在模似悬浮的视图排序功能,但发生在文档的大表格内部。很明显,这是一个将您的大量数据设为局部变量,然后对局部变量进行排序的恰如其分的环境。它带来的性能方面的差异令人惊讶。在作者过去需要花费一分多钟时间来运行的程序通过局部变量的使用降低到一秒内。 最后,第三个例子是查找数据库中特定名称的视图的程序。您可能被通过db.views 属性进行循环所吸引,但您可以通过第一次设定局部变量,如
计算字段
在这种情况下,确保您阻止执行的任何程序(如前面所述)在切换到编辑模式之后开始执行。例如,当用户以读模式打开文件时使用
在这种情形下,您可以希望尽可能多的把昂贵(性能方面)的程序转移到按钮中,从而频繁的编辑不会陷入困境。这假设即使在编辑文件时,大多数用户不需要更改所有关键性字段。 您可能认为上述建议需要更多的计算,而不是少数计算。从某种意义上讲,这是对的。只有采用这些步骤才能避免昂贵的计算,如@Db 公式,同时不用括号把简单的 刷新字段值
这样做会对您的性能产生负面影响,因为每次用户把鼠标移到表格字段时所有以前的字段都重新计算。这一繁重计算的目的是首先检查Input Translation和Input Validation公式,但实际上所有程序都运行。 当用户选择特定值时,如果您需要刷新计算的字段中的关键字表,选择字段属性对话框控制标记上的"当关键字改变时刷新域"选项。例如,假设您在表格中有多个关键字字段,关键字字段二、三和四的值不同,取决于用户在关键字字段一中选择的值。在这种情况下,使用"当关键字改变时刷新域"功能。这就像按下F9键一样,只是每次这一关键字字段中的值更改后它自动运行。这提供了胜过表单对话框中"自动刷新域"选项的性能,因为文档只在第一个关键字字段中的值更改后才刷新,而不是任何值更改后都刷新。注:您必须为其它关键字字段设置字段选项"当文档刷新时刷新选择"。任何无需参与这一动态关系的关键字字段无需设置这一项功能,因此当第一个关键字字段的值更改后它们无需刷新。
使用"创建时计算"的域类型
您可能会问,在这两个例子中使用创建时计算的域 和计算域 有什么区别。主要的区别很简单,每次编辑、刷新和保存文件时计算域都计算,即使它没有真正的工作要执行也是如此。如果有大量与上述一样简单的公式,那么这一字段类型会给您的应用程序的性能带来稍许差异。但是,如果在您的表单中有许多类似的字段,您将看到性能方面的差异。在此例中,由于设置这一字段为计算字段不会带来任何优势,您的用户可以获得更好的性能。一个真正不劳而获的例子!
缓存和非缓存参数
用户反而考虑数据更改的程度:数据更改得越频繁,您就越想使用非缓存参数。对于不频繁更改的数据,使用缓存参数。例如,假设您有一个讨论数据库,其中用户可以使用规定的关键字,它们创建了新类别。(也就是每次用户创建新主题时,他或她可以为该主题规定任何类别。)在这种情况下,这类数据可能相对不重要,但您仍然需要使用非缓存参数,从而在一行中输入两个或三个主题的用户发现新类别在下一主题的关键字字段中立即反映出。为了提高性能,使用非缓存参数和ODBC访问:"在索引中产生唯一的关键字"选项,它已经在 第一部分中讨论过。记住:"在索引中产生唯一的关键字"选项只列出唯一的类别来维护一个较小规模的视图索引。
举一个反例,假设您查找薪水信息。这是一类至关重要的信息,但是,通常每隔几个月薪水才会更改一次,从而使这类数据成为缓存的一个很好的候选对象。
LotusScript方法
在这类测试过程中,使用不同大小的数据库(10,000、100,000和1,000,000份文档)来了解每种方法是如何很好地运行的。 db.FTSearch方法
db.Search方法
view.GetAllDocumentsByKey方法
其中i从1增加到DocumentCollection.count。 对于文档小集合来说-和对于单独运行的程序来说,如预定的代理-性能下降为最小,但对于文档大集合来说-或者许多用户同时运行的程序来说会影响性能,它使GetNth成为不明智的选择。GetNth方法通常适用于您想要从集合中挑选文档的情形,而不是简单地遍历整个集合。 view.GetDocumentByKey方法
注:如果前一份文档已经从视图中删除,当有机会访问视图中的下一文档时,view.AutoUpdate = False主要用于避免错误信息,但它还可以显著提升性能以便运行代理。当更改文档中的数据时,使用view.AutoUpdate = False您会看到视图中有显著的改进。
事件、共享的要素和其它
当删除程序时,注意完全删除它。不要只是重新标记它为删除,或者部分删除程序。您可以根据circle/squiggle是填满还是清空来告诉事件是否有程序代码。
使用共享的元素来保存某些工作以及重复一个要素来提升性能时仔细考虑。
在精心编程的情形下,通过当它逻辑上应结束时使其继续运行,这可以确保您的程序不会"漏掉"。
大规模的子表单会影响应用程序的性能。如果您在应用程序中未多次使用大规模的子表单,考虑在每个表单中重复这类字段,而不是使用子表单。
在文档中使用较少的字段与性能相关,而不是文档的大小。使用具有较多数据的较少字段,如多值字段,而不是使用较少数据的比较多的字段可以提升应用程序的性能。由于许多传统的编程人员对Notes/Domino应用程序开发不熟悉,这可能一些概念直观,但实际测试很明显地验证了这一概念。
正如前面介绍,同时使用
当您需要使用静态值来标记大量文档时这种方法极其有效,如当前日期/时间或值的标记集。
动态数组是比固定数组稍微低效率的执行性能,但动态数组的规模恰如其分,在您选择固定还是动态数组之前请预以权衡。
结语
作者简介
|