简谈 ERP表单高效率计算的先决条件

我在谈什么?

在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,因为他们没有出现先后问题,所以,允许两个计算任务并行,不会造成取值时的冲突。

但我认为,虽然理论是可行的,但是这些计算任务已经是本地内存计算了,且都是客户端单机执行,并行得到的效果微乎其微,甚至因为开启了新的线程而任务量太小,反而性能下降。

原文地址:https://www.cnblogs.com/tansm/p/2866656.html