插入itab工作区与字段符号性能对比?

问题描述 投票:0回答:1

我正在测试将 150 个待办事项插入到我的表中。我在工作区中使用循环完成了一次,然后使用字段符号完成了一次。我认为使用字段符号会更快,但不知何故,字段符号为 167.333,工作区域为 143.431(我假设它是毫秒?)。我是不是做错了什么?

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.
json insert runtime field abap
1个回答
1
投票

使用变体 INSERT … FROM TABLE 还可以一次插入内表中的所有元素:

INSERT zalm_fs_todos FROM TABLE lt_todo.

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

———-

也就是说,这里所做的“基准”是毫无意义的。要获得正确的基准,请执行以下操作:

  • 尽可能独立地运行每个变体 n 次,然后使用平均值(和标准差来估计置信区间)

  • 循环较大的表,对于 150 个条目,我预计差异在微秒内,我猜您在这里测量了另一个效果

通常,在读取时,字段符号变量应该具有相同的特征,并且字段符号应该比写入更大的结构更好。但考虑到字段符号是一种相当奇特的构造,我宁愿选择变量,除非存在显着差异。

© www.soinside.com 2019 - 2024. All rights reserved.