During myTask performance optimization, I realized that currently the read implementation of 5 expanded nodes: Userstatus, document history, document item, attachment etc are done sequentially.

如果看看现在 Java8的parallelStream 的一些sample code, 再来review task offline 5个node的读取, 发现它们也满足并行计算的三要素:

(1) 可重入
(2) Immutable state
(3) Read only data access

因此我们可以考虑把每个node 数据的读取分别放到一个"新线程"(用ABAP术语来讲,应该是新的internal session )来做,这样就和gateway 后台实现batch操作的设计完全一致了。Gateway在SPRO里有个配置控制batch request是串行还是并行实现,默认是并行。
理论上假设5个node 分别消耗的时间是1,2,3,4,5秒. 现在的串行实现,最后的时间是sum(1,2,3,4,5) = 15秒,改成并行处理后是max(1,2,3,4,5) 约等于5秒(加上少许线程同步的时间)
具体的测试report参考AG3 report ZATTACHMENT_SEQUEN_VS_PARALL:

ABAP并发计算的一个实例_ABAP 测试结果

AG3上取440个attachment,一次用串行的方式执行,另一次分成4个线程分别执行,每个线程里仍然call的未优化的代码。用代码比较确保两次执行返回的结果完全一致。

ABAP并发计算的一个实例_ABAP_02

详细测试数据如下:

ABAP并发计算的一个实例_ABAP_03ABAP并发计算的一个实例_ABAP_04ABAP并发计算的一个实例_ABAP_05

要获取更多Jerry的原创文章,请关注公众号"汪子熙":
ABAP并发计算的一个实例_ABAP_06