json SAP ABAP INSERT到工作区循环的表中比带引用的循环花费更少的时间?

yjghlzjz  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(221)

我测试了150个todos到我的表中的插入。我在工作区中用循环做了一次,然后用引用做了一次。我以为使用引用会更快,但不知何故,它是167.333的引用和类似143.431的东西(我假设它的毫秒?)使用引用。我是ABAP的新手,我做错了什么或者为什么?我的代码:

TYPES: BEGIN OF ty_todo,
         mandt     TYPE mandt,
         id        TYPE int4,
         userId    TYPE int4,
         todo      TYPE string,
         completed TYPE abap_bool,
       END OF ty_todo.

DATA lv_dauer TYPE i.
DATA: lt_todo TYPE STANDARD TABLE OF ty_todo WITH DEFAULT KEY.
DATA wa_todo TYPE ty_todo.
DATA: lv_json TYPE string.
FIELD-SYMBOLS: <fs_todo> type ty_todo.

lv_json = `[{"id":1,"todo":"Do something nice for someone I care about","completed":true,"userId":26},...] 

* JSON -> ABAP (iTab)
/ui2/cl_json=>deserialize(
  EXPORTING
    json             = lv_json
*    jsonx            =
    pretty_name      = /ui2/cl_json=>pretty_mode-camel_case
*    assoc_arrays     =
*    assoc_arrays_opt =
*    name_mappings    =
*    conversion_exits =
*    hex_as_base64    =
  CHANGING
    data             = lt_todo
).

DELETE FROM zalm_fs_todos.

get run time field lv_dauer.

*Loop in Workarea
LOOP AT lt_todo into DATA(lv_todo).
  INSERT zalm_fs_todos from lv_todo. 
ENDLOOP.

*Loop mit Field-Symbol
* loop at lt_todo assigning <fs_todo>.  
*      INSERT zalm_fs_todos from <fs_todo>.
*endloop.

get run time field lv_dauer.
Write lv_dauer.
yhxst69z

yhxst69z1#

使用变量INSERT... FROM TABLE,还可以一次插入内部表格中的所有元素:

INSERT zalm_fs_todos FROM TABLE lt_todo.

这应该会快很多,因为它只对数据库执行一次往返。

  • ——-
    也就是说,这里做的基准测试是没有意义的。要得到一个合适的基准测试,请执行以下操作:
  • 尽可能独立地运行每个变量n次,然后使用平均值(和标准差来估计置信区间)
  • 在较大的表中循环,对于150个条目,我希望差异在微秒内,我猜您在这里测量的是另一个效果

一般来说,* 字段符号 * 和 * 变量 * 在阅读时应该具有相同的特性,并且字段符号应该比编写更大的结构更好,但是考虑到字段符号是一个相当奇特的构造,我宁愿选择变量,除非有显著的区别。

相关问题