双重loop循环时第二个loop用where…

用se30的时候,看到一段双重loop的代码,自己写了个例子测试了下
第二层loop不要用where判断,会慢
直接使用他的index

代码如下

*&---------------------------------------------------------------------*
*& Report ZLM_TEST001
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zlm_test001 .


DATA t0  TYPE  i ,
      t1  TYPE  i ,
      t2  TYPE  i ,
      t3  TYPE  i ,
      t4  TYPE  i ,
      t5  TYPE  i ,
      t6  TYPE  i ,
      tm  TYPE  i .

DATA :
   BEGIN  OF str_data ,
     id    TYPE int4 ,
    name  TYPE string ,
   END  OF str_data .

DATA :
      l_dex  TYPE int4 .
DATA :
  l_it_1  LIKE  TABLE  OF str_data  WITH  KEY  id  WITH  HEADER  LINE ,
  l_it_2  LIKE  TABLE  OF str_data  WITH  KEY  id  WITH  HEADER  LINE .

GET  RUN  TIME  FIELD t1 .
DO  10000  TIMES .
  l_it_1 - id  sy - index .
  l_it_1 -name  sy - index .
   APPEND l_it_1 .

  l_it_2 - id  sy - index .
  l_it_2 -name  sy - index .
   APPEND l_it_2 .
ENDDO .

GET  RUN  TIME  FIELD t2 .

t3  =  t2  t1 .

WRITE t3 .
SKIP .

CLEAR :t1 ,t2 ,t3 ,t4 .

"纪录当前时间
GET  RUN  TIME  FIELD t1 .


"相对比的字段 排序
SORT l_it_1  BY  id  .
SORT l_it_2  BY  id  .


GET  RUN  TIME  FIELD t1 .

LOOP  AT l_it_2  .
   LOOP  AT l_it_1   WHERE  id  l_it_2 - id .
     EXIT .
   ENDLOOP .
ENDLOOP .

GET  RUN  TIME  FIELD t2 .



GET  RUN  TIME  FIELD t3 .

*--------------------------------------------------------------------*

l_dex  1 .
LOOP  AT l_it_2   .

   LOOP  AT l_it_1   FROM l_dex .
     IF l_it_1 - id  l_it_2 - id .
      l_dex  l_dex +  1 .
       EXIT .
     ELSE .

       CONTINUE .
     ENDIF .
     " ...
   ENDLOOP .
ENDLOOP .

GET  RUN  TIME  FIELD t4 .

t5  t2  t1 .
t6  t4  t3 .

WRITE :'使用where用时:' t5 .
WRITE :'使用index用时' ,t6 .


tm  =  t6  t5 .

WRITE :'index - where' ,tm .

执行结果 双重loop循环时第二个loop用where还是使用index

其实原因,我自己的理解是:
第一种情况用了where,本质还是全部循环了。
第二种,我是用index,找到了就continue,最优是1,最差是N,这个复杂度大家应该也知道。

但是很多时候,loop套用loop的时候,第二层还是使用where的居多。
如果没有对性能上特别要求,应该没必要修改,
如果数量太大,而性能受到了严重影响的时候,
可以在优化其他的时候,试着修改下多层loop里的算法。


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值