我在談什么?
在ERP表單中,當用戶鍵入某個值時,軟件需要對其進行交互,例如當用戶錄入 “AS001"這個物料時,我們需要從數據庫檢索出這個編號的物料,並將名稱、單價等數據填充到必要的字段,用戶通過選擇對話框挑選物料也是如此。本文所稱的”計算任務“就是指:從用戶錄入"AS0001"之后所做的所有執行代碼。
這些計算任務是由很多的小的計算任務組成的,你可以理解為為編寫很多的方法,各自完成不同的功能。本文闡述的就是如何提高這些計算任務的執行效率,即 ERP表單高效率計算的先決條件。
可以一次性推導需要執行的計算任務
當發生某個事件,包括屬性改變事件、插入、刪除等等后,如果能一次性推導需要執行多少計算任務,就有機會完成后面的所有優化,他是完成下面所有優化的先決條件。
假設有公式C = A * B,和 D = C + E,當A改變后,我們需要推導出兩個公式都需要執行,而不是僅公式1執行。
所有計算任務都是能夠推導出先后順序的
其實這條和第一條是緊密聯系的,要完成此特性,需要為計算任務聲明他的依賴項和影響項。例如公式:C = A * B,其A,B實依賴項,C是影響項。當A改變后,你就知道這個公式需要執行,僅僅這樣還不夠,如果還有一個公式 D = A + C,那么當A改變后,兩個公式都需要執行,但是如果你先執行后面一個公式,那么前面一個公式就需要執行兩次。有了影響項,你就可以推導出公式1的影響項也是公式2的依賴性,所以公式1先執行。
有了依賴項和影響項這個特性,我們其實可以回頭看第一點,有了依賴項,我們就可以根據發生的事件推導出第一層需要執行的計算任務,如果有影響項的話,我們就可以繼續推導出更多的計算任務。
目前來看,依賴項和影響項形成了一個有向無環圖,如果出現了環就會導致問題,例如 金額 = 單價*數量,另外一個公式: 數量= 金額 ÷ 單價,這種死循環的公式是目前無法支持的。
計算任務應該是批量的
用戶如果使用對話框,一次性選擇很多物料,如果你的計算任務不支持批量執行,就會到服務端分別執行很多的SQL,好的方式是一次性執行所有物料的獲取,這將大大提高執行效率。
對於單個的錄入,其實計算任務相當於執行只有一筆記錄的批量程序。
計算任務是支持數據准備的
設想,如果用戶錄入物料,一個計算任務需要獲取物料的名稱用於顯示,而另外一段計算任務需要物料的價格,用於計算金額,設計良好的計算任務應該能夠統一的獲取物料的信息,這樣減少數據庫的負載,我稱這種功能為數據准備。
即通過第一點推導出所有計算任務,然后推導出現后順序,以及可以第一層執行的所有任務,將這些任務匯總起來,獲取他們的數據准備請求,這樣就可以統一的執行服務端請求。
計算任務可支持並行計算
這個目前來看不是必須的,因為通過數據准備的支持,已經大大減少了執行的時間,其余的運算都是在本地內存中的,而且通過先后順序的推導,我們又不會出現重復的執行。
但是如果我們需要錦上添花支持並行計算的話,也是可以做到的,例如公式C = A * B和公式D = E + F,因為他們沒有出現先后問題,所以,允許兩個計算任務並行,不會造成取值時的沖突。
但我認為,雖然理論是可行的,但是這些計算任務已經是本地內存計算了,且都是客戶端單機執行,並行得到的效果微乎其微,甚至因為開啟了新的線程而任務量太小,反而性能下降。