技术开发 频道

ABAP性能实例七例

    10.2.Filling nested internal tables(填充嵌套的内表)

    采用自底向上的策略填充嵌套内表,需要多付出很多次move操作的时间,嵌套中内部inner内表的内容会被moved到上一层的数据结构中。

    相反,采用自顶向下的策略,首先填充外部outer内表,再采用"LOOP ... ASSIGNING"可以直接更新内部内表,这样,inner tables的内容只会被移动一次。

    DO 50 TIMES.

      CLEAR WA.

      DO 10 TIMES.

        APPEND N TO WA-INTTAB.

        ADD 1 TO N.

      ENDDO.

      APPEND WA TO ITAB.

    ENDDO.
   

    DO 50 TIMES.

      APPEND INITIAL LINE TO ITAB.

    ENDDO.

    LOOP AT ITAB ASSIGNING <F>.

      DO 10 TIMES.

        APPEND N TO <F>-INTTAB.

        ADD 1 TO N.

      ENDDO.

    ENDLOOP.

    11.Building condensed tables

    COLLECT使用一种HASH算法,因此它不依赖内表的记录数而且不需要维护表索引sy-tabix,如果你需要最终的内表是排序的,那么在所有数据都Collect完以后再排序内表。

    如果内表的记录数量较少,可以使用READ/INSERT的方法,也可以取得较好的效率,但是如果数据量大于1000,那么还是使用Collect效率更好些。

    注意:在使用Collect填充一个内表时,不要混合使用其他操作内表的语句,例如 (APPEND, INSERT, MODIFY, SELECT * INTO TABLE and/or SELECT * APPENDING TABLE)。如果你将Collect与这些语句混合使用操作操作内表,那么Collect就不会使用HASH算法,在这种情况下,COLLECT会重新排序为一个普通的线性搜索,性能会显著的降低为O(n).

    LOOP AT ITAB1 INTO WA1.

      READ TABLE ITAB2 INTO WA2 WITH KEY K = WA1-K BINARY SEARCH.

      IF SY-SUBRC = 0.

        ADD: WA1-VAL1 TO WA2-VAL1,

             WA1-VAL2 TO WA2-VAL2.

        MODIFY ITAB2 FROM WA2 INDEX SY-TABIX TRANSPORTING VAL1 VAL2.

      ELSE.

        INSERT WA1 INTO ITAB2 INDEX SY-TABIX.

      ENDIF.

    ENDLOOP.

    

    LOOP AT ITAB1 INTO WA.

      COLLECT WA INTO ITAB2.

    ENDLOOP.

    SORT ITAB2 BY K.

0
相关文章