潤幹報表效能管理之表示式預解析

2021-07-25 00:13:36 字數 1051 閱讀 8349

功能背景

由於單元格是擴充套件的,設計時只有乙個單元格,運算後,可能擴充套件出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、 由於表示式預解析是授權檔案控制的,沒有開關可以配置或者控制,所以將來如果遇到上述現象,只能要求研發改程式,增加特殊判斷。

潤幹報表效能管理之集群快取同步功能

功能背景 目前伺服器的集群,經常使用session同步的功能,在這種情況下,允許同乙個客戶端,第一次訪問a機器,第二次跳轉到b機器繼續訪問,伺服器會自動把a機器產生的session的內 容複製到b機器上,使得訪問正常進行,從而實現伺服器之間負載更加均衡。潤幹報表的快取是在硬碟上做的,於是當客戶端第一...

潤幹報表效能管理之分頁計算標籤

功能背景 報表大到一定程度,必然會記憶體溢位,此時比較好的解決辦法似乎是邊算邊輸出。分頁計算標籤是產品部自己做的,利用報表組來實現的逐頁計算逐頁輸出的tag標籤。實現原理 把報表根據每頁展現行數,以及從資料庫裡獲取的最大行數,分成n頁,然後把所有頁的報表定義組成乙個報表組,利用報表組實現了逐頁計算逐...

正規表示式之正向預查和反向預查

正向預查 1.正向正預查 例如 foo bar 匹配後面帶有bar的foo 它可以匹配 foobar,abcfoobar 中的foo 但是不能匹配 fooabc 中的foo 2.正向負預查 例如 foo bar 匹配後面不帶bar的foo 它可以匹配 foo123 但是不能匹配 foobar 負向預...