zoukankan      html  css  js  c++  java
  • 双重loop循环时第二个loop用where…

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

    代码如下

    REPORT  zlm_test_003.

    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:
          BEGINOF str_data,
           id TYPE int4,
           name TYPE string,
           END OF str_data.

    DATA:
          l_dexTYPE 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 ASCENDING.
    *SORT l_it_2 BY id ASCENDING.
    SORT l_it_2 BY id DESCENDING.


    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.
         EXIT.
        ELSE.
          l_dex= l_dex + 1.
         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里的算法。


    http://blog.sina.com.cn/sapliumeng
  • 相关阅读:
    local http
    redis 存储时间区间的数据
    json 和 jsonp
    ssdb 常用命令行
    php 冒泡排序
    pdo 函数
    异步的消息队列
    php 全局变量$_SERVER
    php 技能树
    get_called_class/get_class方法
  • 原文地址:https://www.cnblogs.com/senlinmu110/p/3802169.html
Copyright © 2011-2022 走看看