Domino开发要点编码语言以及代码优化分析
3.开发要点编码语言以及代码优化分析
3.1编码语言的选择
在具体的开发过程中,根据需求性质,DOMINO可以有多种编码语言的选择。主要有公式、lotusscript、java、javascript语言,比较起来,特别简单的功能和逻辑,用公式实现比较快;复杂的功能和逻辑,用lotusscript比较快。java语言可以实现多线程,完全面向对象,处理大量文档时,如果程序利用到多线程,比不能利用多线程的lotusscript快。另外针对于底层开发,LOTUS还有专门的Toolkits支持:
按Lotus产品系列来分,Lotus提供下列产品的工具包:Notes/Domino、Sametime、QuickPlace、Discovery Server、Other。
其中,Notes/Domino和Sametime的工具包比较多,C、C++、Java语言的都有,其他产品的则很少。从这个角度,也可以看出文档数据处理、协同工作是Lotus系列产品的核心价值所在。其中,Notes/Domino的工具包有:
Lotus C API toolkit Lotus C++API toolkit
Lotus Domino Toolkit for Java/CORBA Lotus and Notes Toolkit for COM Lotus Domino Driver for JDBC(简称LDDJ)NotesSQL
Lotus XML Toolkit(简称DXL)Custom Tag Converion kit(简称DCT)LotusScript Extensions toolkit(简称LSX)
在Domino/Notes的Toolkit中,C API的功能最为强大:可以操纵notes 数据库中几乎所有的数据对象:数据库及ACL、文档和域、表单、视图和文件夹、代理、可以为Notes客户端的增加附加菜单、可以用来创建附加的Domino服务任务、可以用来扩展Domino/Notes的事件管理。
而其主要限制如下:
不能修改已有的Domino/Notes软件,不能去除其已有的功能、特性,或者改变其工作机理、不能修改安全特性、不能修改用户活动记录
支持的操作系统:WindowsNT/2000,Linux,Solaris SPARC/Intel, HP-UX,MacOS,AIX,AS/400,S/390等。
3.2编码优化原则
1)公式语言优化
1.使用@ClientType代替@UserRoles来检查客户端类型
从R4.6开始,不必使用@UserRoles中的$$WebClient来检查客户端是否使用浏览器,直接使用@ClientType比较快
2.使用简单的公式隐藏条件比较快
以下三种写隐藏的选择,性能递减。可以利用第一个,不要写判断
@ClientType的公式;可以利用编辑模式,不要写判断@isdocbeingedited的公式
a.根据客户端程序类型
b.根据编辑模式
c.根据公式隐藏
3.在@dblookup和@dbcolumn公式中使用列号比使用域名快
使用域名需要在域列表中对比,但直接使用列号会带来维护的困难。
4.打开@dblookup和@dbcolumn的cache开关
cache不但可以使这个公式执行更加快,而且可以使‘同一个数据库’中,‘同样公式’的另一个lookup运行更快。cache是基于数据库的,不同数据库的相同lookup不能利用相同的cache。注意:无论是否打开cache,lotusscript
调用evaluate的lookup都不能利用cache。
5.根据4,如果公式和lotusscript都要利用相同的lookup结果,可以将信息放到profile文档中。
6.要lookup一个包含很多文档的视图时,创建一个隐藏视图,仅包含必要的列。视图越小,越快。
7.如果要取视图中的几个列,分别取的话,每个lookup都要花时间。将几个列组合成一个列,用特别的字符分隔,一次取出来,然后分析出几个域。
8.一段公式中,数次利用同一个结果集,用临时变量保存,而不是每次重新取
9.使用不同的搜索方法,如果处理的文档集较小(例如少于数据库中所有文档的15%),使用lotusscript比公式快,如使用getview,search,ftsearch等方法。
10.使用‘显示时计算’域来避免不必要的重复计算。下表是使用各种类型域时,不同事件引发的计算情况:
Field Create Open Open Show Save Refresh
Type(empty)(data)Dialog Edit DV
IT,IV IT IV
(normal)
Edit DV KF
KF IT,IV IT IV
(K-UF-DB)
Edit KF,DV KF KF
IT,IV IT IV
(K-UF-Not DB)
Computed V
V V
Computed for
display V V V
V V
Computed for
composed V
上面缩写的解释
normal----Normal edit field(not one of the two special ones that follow) K-UF-DB---Keyword,Use formula for choices,dialog box
K-UF-Not DB---Keyword,Use formula for choices,check boxes or radio buttons
DV-----Default value formula executes
IT-----Input translation formula executes
IV-----Input validation formula executes
KF-----Keyword formula executes
V-----Value formula executes
Create----Field is being created(either because the document is being created
or an existing document is opened that does not contain the field) Open-----Opening an existing document—in either Read or Edit mode Empty---Field is empty(exists in document but has no contents)
data-----Field has data
Show Dialog---User presses the icon to display the dialog box
注意两点:
1.使用check box和radio box,一打开文档,公式总要计算,即使仅仅打算阅读而不是修改文档,看起来是合理的,因为需要计算出各个项目供阅读嘛
2.已经有数据的,使用对话框格式的编辑域,打开时候也要重新计算,这个就不太合理了。
当使用复杂的@dblookup时,性能有很大影响。隐藏公式域没有作用,因为仍然会发生计算。按照下面方法解决
1)创建一个隐藏的多值‘显示时计算’域:kwDataHidden,计算公式是原来的@dblookup公式,但仍然要做如下处理,值公式写成这样:
rem"Do not run formula during doc save";
@if(@IsDocBeingSaved;@Return("");"");
rem"Only run if doc is in edit mode";
@if(@IsDocBeingEdited;@DBColumn(............);"")
2)在表单的PostModeChange中,写:
@If(@IsDocBeingEdited;@Command([ViewRefreshFields]);""),(实际上,如果觉得公式的值的修改频率不是太快的话,这里也可以不写)
3)真正操作那个域的公式写:kwDataHidden;并且该域属性选择‘刷新文档时刷新选项’。
2)脚本语言优化
1.使用For loop,不使用Do loop或者while loop的循环
前者比后者快60%(不计算循环内部时间的情况下)
2.引用数组元素的时候,使用Forall比for快
一维数组,前者快75%,二维以上,也可以快50%
3.简化if语句
lotusscript不会象c那样进行逻辑语句优化,所以
If a=x and b=y then
应该写成
If a=x then
if b=y then
后者快40%
4.避免混合变量类型(计算)(也就是不要隐式造型)
dim a as single
dim z as long
z=3
a=1.0
z=z+a
上面这一段使用了implied casting,z=z+(long)a会比较快
1.对整数结果,使用整数除法:z&=x&\y&比z&=x&/y&快60%
2.仅在有必要的时候才使用variant类型,lotus使用更多的时间处理variant
3.读取文件的时候,一次读取一块,而不是一行,下面的例子A比B快接近5倍!而且读取的文件越大,越明显。
example A
Open fName$for input as#fNum
buff$=Input$(Lof(fNum),fNum)
stPos=1
lineNo=1
eoFile=false
While Not eoFile
nlPos=Instr(stPos,buff$,Chr$(13))
If(nlPos)>0)then
fData$(lineNo)=Mid$(buff$,stPos,nlPos-stPos)
stPos=nlPos+1
else
fData$(lineNo)=Mid$(buff$,stPos)
eoFile=true
end if
lineNo=LineNo+1
wend
close#fNum
example B
Open fName$for Input as#fNum
lineNo=1
while Not Eof(fNum)
Line Input#fNum,fData$(lineNo)
lineNo=lineNo+1
wend
close#fNum
注意,R4.6以及之前的版本,string变量有64k的限制,所以一上例子a需要再增加一些东西(不能一次读取,而是要分次读取文件),但块读取的好处仍然是显而易见的。R5开始,string变量可以最大达到2G,足够读取非常大的文件了。例子A虽然增加了代码量,但是可以大大加快速度,某些场合非常有用5.避免无谓地使用数组,下面例子A比例子B快两倍
Example A
For i=1to100
sum=sum+x(i)
Next
t(1)=sum
Example B
For i=1to100
t(1)=t(1)+x(i)
Next
Domino R5引入了新的数组处理函数:ArrayAppend,ArrayGetIndex,
ArrayReplace,FullTrim,使用这些函数比自己写相同的功能快
6.有一个不使用字符串数组的替代方法
把所有数组中的字符串元素构造成一个字符串,用特殊分隔符分开(例如回车符),然后用Instr来取各个元素
7.优化字符串的处理
字符串的处理非常消耗资源,例如下面这句很常见
X$=X$&"a"
这个语句非常消耗资源(java中有类似现象,因为涉及到重新生成字符串),下面这句缩短字符串也是很消耗资源的
x$=Right$(x$,currentLength%-lengthStrippeddOff%)
8.创建一个新的字符串有时候更加快
下面例子A比B快25%
A
str$=stringA$&stringB$
B
str$=stringA$
str$=str$&stringB$
9.反复处理字符串时,记住处理位置
比不断修改字符串长度快(其实是不断生成新的字符串),下面例子A比B 快85%
A
strPiece$=Mid$(str$,startPos%,pieceLength%)
startPos%=startPos%+pieceLength%
B
strPiece$=Left$(str$,pieceLength)
strLength%=strLength%-pieceLength%
str$=Right$(str$,strLength%)
10.谨慎是用redim命令
可以理解,每次redim,是内存堆数据的乾坤大挪移,所以尽可能事先决定数组大小。实在没有办法,也千万不要在循环中redim。以下例子A比B快20% A
For i=1to10000
If(i>iMax)then
iMax=iMax+100
redim Preserve sArray(1to iMax)
end if
sArray(i)=""
Next
B
For i=1to10000
字符串转数组工具Redim Preserve sArray(1to i)
sArray(i)=""
Next
以上实际是减少redim的次数,每次增加多些,循环后可能还需要一次redim,
让数组空间和实际一致
11.在多维数组中循环
应使用正确的顺序。在外循环中操作后面的维数,在内循环中操作前面的维数(这个最奇怪了,估计跟数组的内存排放有关),下面的例子A比例子B快400%!(实际测试,500的PIII,看不出差别,都很快,当我再想增大数组元素个数的时候,宣称已经超过32K限制了,faint!看来意义不大)
A
For y=0to2
for q=0to5000
z=z+x(q,y)
Next
Next
B
For q=0to5000
For y=0to2
z=z+x(q,y)
next
next
12.比较整数,而不是比较字符串
下面的例子A比例子B快50%,例子C比例子D0%
A If(Asc(x$)=Asc("A"))then
B If(Left$(X$,1)="A")then
C If(Asc(Mid$(x$,1,1)="A")then
D If(Mid$(x,1,1)="A")then
下面比较空串的例子E也比例子F0%
E If(Len(x$)=0)then
F If(x$="")then
13.将数字转为字符串的时候使用自动造型,不用手工转换
例如s2$="Text"&iNum比s2$="Text&Cstr(iNum%)稍微快一点,不过不明显。
14.重要:避免过多使用环境变量
环境变量要读取notes.ini文件,对性能造成影响,替代办法是使用profile。如果一定要使用环境变量,将多个环境变量合并成一个,用特殊符号分隔,取出来后再分析成多个。取10个单独的环境变量要比取一个长的环境变量多花10倍时间!
3)Java&JavaScriptino应用程序优化
Java需要装入JVM,client端第一次运行的时候装入,server端,随着http装入的时候装入(所以不用http就不要装入了,估计慢也是受到jvm影响)有关java没有什么好说,就说两点。
1.将需要的java类,尽可能放在类列表前面,尽可能接近base类,可以加快搜索速度
2.周期性调用回收函数,java本身是自动进行垃圾收集的,但是该书的意思似乎说java的垃圾回收,不能回收相关lotus objects用掉的内存
3.Javascript,没有什么好说的,用于web页面,域校验,和输入转换,可以避
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论