我正在测试将 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.
使用变体 INSERT … FROM TABLE 还可以一次插入内表中的所有元素:
INSERT zalm_fs_todos FROM TABLE lt_todo.
这应该快很多,因为它只与数据库进行一次往返。
———-
也就是说,这里所做的“基准”是毫无意义的。要获得正确的基准,请执行以下操作:
尽可能独立地运行每个变体 n 次,然后使用平均值(和标准差来估计置信区间)
循环较大的表,对于 150 个条目,我预计差异在微秒内,我猜您在这里测量了另一个效果
通常,在读取时,字段符号和变量应该具有相同的特征,并且字段符号应该比写入更大的结构更好。但考虑到字段符号是一种相当奇特的构造,我宁愿选择变量,除非存在显着差异。