润乾报表性能管理之表达式预解析
功能背景
由于单元格是扩展的,设计时只有一个单元格,运算后,可能扩展出n个单元格。如果在单元格扩展前先对表达式进行解析,把能够算出来的部分先算,或者需要引用的变量先进行
定位,就不需要在扩展后重复的运算n遍,或者对变量定位n次。
举例:
1、 表达式中的常量计算:某个单元格中的表达式为(5-arg1*1)*A1+(3*(arg2+3)/2),其中arg1和arg2为传入的参数值。假设arg1=2,arg2=3,此时如果在报表扩展前进行表达
式预解析,这个表达式解析后成了3*A1+9.如果这个单元格扩展了1000次,那么只需要对3*A1+9计算1000次。但是,如果不进行表达式预解析,那么需要对(5-arg1*1)*A1+(3*
(arg2+3)/2)计算1000次,相当于(5-arg1*1)和(3*(arg2+3)/2)分别被重复算了1000次。
2、 表达式中的变量引用:某个单元格中的表达式为ds1.colname,其中ds1为数据集的名字,colname为列名。该表达式进行计算时,需要先定位colname为第几个列,从而在
列对象存放数组里找到这个列。在报表扩展前进行表达式预解析时,这个表达式被解析成ds1.#n,其中n代表第几个列。这个单元格如果被扩展了1000次,那么这1000次的运算都可
以直接定位到列,不需要重复定位。
类似的预解析还很多,无法一一穷举,总之,其原则就是利用报表的扩展原理,在单元格扩展前把表达式中能计算的先算出来,能定位的先定位,避免扩展后的重复计算
实现原理:
在单元格的每次扩展前,进行表达式解析,能算的先算,能定位的先定位。
需要注意的是:
1、 可能有些不希望被预解析的函数也被预解析了,举例来说,rand()函数是生成随机数的,我希望格子扩展后每个格子生成一个随机数,结果预解析后,扩展前人家就把这
个函数算出来了,搞得每个格子的值是一样的。当然,后来rand()函数被特殊处理了一下。但是,还会不会有别的类似rand()的函数?似乎这个只有遇到了才知道,比如用户自定
义函数等。
2、 由于表达式预解析是授权文件控制的,没有开关可以配置或者控制,所以将来如果遇到上述现象,只能要求研发改程序,增加特殊判断。