loops - LOOP itab vs VALUE FOR 过滤,哪个更高效?
问题描述
我正在尝试为以下场景编写一个 for 循环语句:
我使用了一个选择将多个tvarvc
条目数据放入T_TVARVC
.
LOOP AT t_tvarvc INTO DATA(s_tvarvc).
CASE s_tvarvc-name.
WHEN c_augru.
s_tvarvc_range = CORRESPONDING #( s_tvarvc ).
APPEND s_tvarvc_range TO t_augru.
WHEN c_vkorg.
s_tvarvc_range = CORRESPONDING #( s_tvarvc ).
APPEND s_tvarvc_range TO t_vkorg.
ENDCASE.
ENDLOOP.
这就是我想出的:
DATA(t_augru) = VALUE tt_tvarvc( FOR s_tvarvc IN t_tvarvc
WHERE ( name = c_augru )
( CORRESPONDING #( s_tvarvc ) ) ).
DATA(t_vkorg) = VALUE tt_tvarvc( FOR s_tvarvc IN t_tvarvc
WHERE ( name = c_vkorg )
( CORRESPONDING #( s_tvarvc ) ) ).
我的观察是,通过使用LOOP AT
和CASE
语句组合,迭代次数将与T_TVARVC
. 但是当对每个范围表
使用循环时,必须遍历更多次才能到达所需的条目,从而导致比第一种情况更多的迭代。FOR
T_TVARVC
这可以以更有效的方式编写吗?
解决方案
我同意您关于将迭代加倍并使其更快的观察,我认为唯一的解决方案是仅使用一个循环,考虑到内部表尚未排序,这极大地限制了可能的解决方案,我来这个解决方案:
TYPES: tt_tvarvc TYPE STANDARD TABLE OF tvarvc WITH EMPTY KEY,
BEGIN OF ty_ranges,
t_augru TYPE tt_tvarvc,
t_vkorg TYPE tt_tvarvc,
END OF ty_ranges.
CONSTANTS: c_augru TYPE tvarvc-name VALUE 'AUGRU',
c_vkorg TYPE tvarvc-name VALUE 'VKORG'.
DATA(t_tvarvc) = VALUE tt_tvarvc( for i = 1 while i <= 100 ( name = c_augru )
( name = c_vkorg ) ).
DATA(ranges) = REDUCE ty_ranges(
INIT ranges2 = VALUE ty_ranges( )
FOR <tvarv> IN t_tvarvC
NEXT ranges2-t_augru = COND #( WHEN <tvarv>-name = c_augru
THEN VALUE #( BASE ranges2-t_augru ( <tvarv> ) )
ELSE ranges2-t_augru )
ranges2-t_vkorg = COND #( WHEN <tvarv>-name = c_vkorg
THEN VALUE #( BASE ranges2-t_vkorg ( <tvarv> ) )
ELSE ranges2-t_vkorg ) ).
(您将在代码中使用ranges-t_augru
andranges-t_vkorg
而不是t_augru
and t_vkorg
)
您可以立即看到该代码比您的两个片段中的任何一个都更不清晰。
此外,与经典循环相比,性能没有任何提升。
回到带有两次 FOR 迭代的代码段,我们可以看到与经典循环相比,目标非常明确(我的观点)。它当然更慢,但可能你不需要获得几微秒,所以我认为这是最好的解决方案(我仍然认为)。
推荐阅读
- php - 从 Firebase 中删除多个数据
- python - 有没有办法根据行/列为数据框绘制热图?
- c - 税级计算器自我分配
- python - Python-删除2列为空/空的行
- data-visualization - 如何使用 Tableau 为赛车条形图创建动态 x 轴
- mysql - 查找日期重叠:如何在 mysql 中查找用户与其他用户重叠的日期?
- c - 我们的教授要求我们编写一个 C 程序,该程序将使用 while 循环显示数字的立方体
- gulp - Gulp 或 grunt 插件来增加一个值?
- r - 按向量 R 的顺序查找先前最大值的列表
- java - 按住按钮 2 秒钟,然后显示 AlertDialog