ABAP 内表访问表达式的性能

内表访问表达式是ABAP 7.4中引入的重要特性,可以使语句变得更加简洁、美观。那么它的读写性能怎么样呢?我进行了一点点测试。

读取

测试代码,使用三种方式读取同一内表,分别是read table关键字、表达式和read table...binary search:

REPORT ztest_read.

DATA: BEGIN OF gs_test,
        index TYPE i,
        des   TYPE string,
      END OF gs_test.
DATA: gt_test LIKE STANDARD TABLE OF gs_test.

CLASS zcl_reader DEFINITION.

  PUBLIC SECTION.

    METHODS:
      constructor IMPORTING itab LIKE gt_test,
      read_by_read,
      read_by_exp,
      read_by_binary.

  PRIVATE SECTION.

    DATA: lt_test  LIKE STANDARD TABLE OF gs_test.

   CLASS-DATA index1 TYPE i VALUE 3769.
   CLASS-DATA index2 TYPE i VALUE 5555.
ENDCLASS.

CLASS zcl_reader IMPLEMENTATION.

  METHOD constructor.

    lt_test = itab.
  ENDMETHOD.

  METHOD read_by_read.

    READ TABLE lt_test WITH KEY index = index1 INTO DATA(ls_test).
    READ TABLE lt_test WITH KEY index = index2 INTO ls_test.

  ENDMETHOD.

  METHOD read_by_exp.

    DATA(ls_test) = lt_test[ index = index1 ].
    ls_test = lt_test[ index = index2 ].

  ENDMETHOD.

  METHOD read_by_binary.

    READ TABLE lt_test WITH KEY index = index1 INTO DATA(ls_test) BINARY SEARCH.
    READ TABLE lt_test WITH KEY index = index2 INTO ls_test BINARY SEARCH.

  ENDMETHOD.

ENDCLASS.

INITIALIZATION.

  DATA(des) = ‘一个字符串‘.

  DO 30000 TIMES.

    gs_test-index = gs_test-index + 1.
    gs_test-des   = des.
    APPEND gs_test TO gt_test.

  ENDDO.

  DATA(gr_reader) = NEW zcl_reader( gt_test ).

  gr_reader->read_by_read( ).
  gr_reader->read_by_exp( ).
  gr_reader->read_by_binary( ).

结果:

如图,内表访问表达式在修改方面的性能和read是一样的。

修改

测试代码,分别使用modify关键字,内表访问表达式,field symbol来修改内表:

*&---------------------------------------------------------------------*
*& Report  ZTEST_ITAB_MODIFY
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ztest_itab_modify.

DATA: BEGIN OF gs_test,
        index TYPE i,
        des   TYPE string,
      END OF gs_test.
DATA: gt_test LIKE STANDARD TABLE OF gs_test.

CLASS zcl_editor DEFINITION.

  PUBLIC SECTION.

    METHODS:
      constructor IMPORTING itab LIKE gt_test,

      modify_by_modify,

      modify_by_exp,

      modify_by_fs.

  PRIVATE SECTION.

    CLASS-DATA new_string TYPE string VALUE ‘喵喵喵?‘.

    DATA: lt_test1  LIKE STANDARD TABLE OF gs_test.
    DATA: lt_test2  LIKE STANDARD TABLE OF gs_test.
    DATA: lt_test3  LIKE STANDARD TABLE OF gs_test.

ENDCLASS.

CLASS zcl_editor IMPLEMENTATION.

  METHOD constructor.

    lt_test1 = itab.
    lt_test2 = itab.
    lt_test3 = itab.

  ENDMETHOD.

  METHOD modify_by_modify.

    DATA idx TYPE i VALUE 1.

    DO lines( lt_test1 ) TIMES.

      READ TABLE lt_test1 INTO DATA(ls_test) INDEX idx .
      ls_test-des =  new_string.
      MODIFY lt_test1 FROM ls_test INDEX idx.
      idx = idx + 1.

    ENDDO.

  ENDMETHOD.

  METHOD modify_by_exp.

    DATA idx TYPE i VALUE 1.

    DO lines( lt_test2 ) TIMES.

      lt_test2[ idx ]-des = new_string.
      idx = idx + 1.

    ENDDO.

  ENDMETHOD.

  METHOD modify_by_fs.

    DATA idx TYPE i VALUE 1.
    FIELD-SYMBOLS: <fs> LIKE gs_test.

    DO lines( lt_test3 ) TIMES.

      READ TABLE lt_test1 ASSIGNING <fs> INDEX idx .
      <fs>-des =  new_string.
      idx = idx + 1.

    ENDDO.

  ENDMETHOD.

ENDCLASS.

INITIALIZATION.

  DATA(des) = ‘一个字符串‘.

  DO 30000 TIMES.

    gs_test-index = gs_test-index + 1.
    gs_test-des   = des.
    APPEND gs_test TO gt_test.

  ENDDO.

  DATA(lr_editor) = NEW zcl_editor( gt_test ).

  lr_editor->modify_by_modify( ).
  lr_editor->modify_by_exp( ).
  lr_editor->modify_by_fs( ).

结果:

可以看出,内表访问表达式在修改普通的标准表时的性能是要稍差于modify关键字的。更不如field symbol。

当然,本文中使用的例子不能代表实际业务场景,因此只可以用作参考。

时间: 2024-10-06 22:16:54

ABAP 内表访问表达式的性能的相关文章

ABAP内表数据做层次XML输出

*&---------------------------------------------------------------------**& Report  Z_BARRY_TEST_XML*&---------------------------------------------------------------------**& 46C - ECC6 通用*&----------------------------------------------

ABAP 内表 详解

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4293475.html 老式的内表类型定义... 214 基于基本类型内表类型... 214 基于结构体类型内表类型... 215 老式的内表对象创建... 215 参照现有内表类型或内表对象来创建... 215 参照现有结构类型或结构对象来

ABAP 内表

定义内表 1. 先声明表结构, 再根据表结构定义内表. TYPES: BEGIN OF w_itab, a(10), b(10), END OF w_itab. DATA: itab1 type standard table of w_itab with header line. DATA: itab2 like table of itab1. 2. 先声明工作区, 再引用工作区结构来声明一个内表. DATA: begin of w_itab, a(10), b(10), end of w_it

ABAP 内表的行列转换-发货通知单-打印到Excel里

需要传入数据到Excel里的模板如上图所示 *&---------------------------------------------------------------------* *& Report  Z_TEST_COL_TO_ROW_02 *& *&---------------------------------------------------------------------* *& *& *&----------------

ABAP 内表的行列转换-发货通知单2

*&---------------------------------------------------------------------* *& Report  Z_TEST_COL_TO_ROW_02 *& *&---------------------------------------------------------------------* *& *& *&--------------------------------------

事务代码STRANS的使用(XML与ABAP内表相互转换)

ABAP ---> XML  and XML --->ABAP 要求的XML格式如下: <handleMLPurchaseOrderServiceResponse> <out> <headers> <baseReturnHeader> <hresv1>4500524641</hresv1> <hresv2/> <hresv3/> <hresv4/> <hresv5/> <

ABAP 内表数据 与 Json串 相互转换

DATA: json_ser TYPE REF TO CL_TREX_JSON_SERIALIZER, json_des TYPE REF TO CL_TREX_JSON_DESERIALIZER. DATA: jsonstr TYPE string. CREATE OBJECT json_ser EXPORTING data = itab[]. CALL METHOD json_ser->SERIALIZE. CALL METHOD json_ser->GET_DATA RECEIVING

ABAP 内表的行列转换-NEW

REPORT Z_TEST_COL_TO_ROW. TYPE-POOLS: slis. TABLES: mseg,mkpf. DATA: gd_fieldcat TYPE slis_t_fieldcat_alv. DATA: sla TYPE slis_layout_alv ,       ivariant LIKE disvariant,       i_repid LIKE sy-repid ,       i_excluding TYPE slis_t_extab. TYPES: BEGI

ABAP基础篇1 内表

内表类型 abap 内表类型有三种: 标准表(一般ABAP程序中用的最多就是这种表) 系统为该表的每一行数据生成一个逻辑索引,自己内部维护着行号(Index)的编码.表的键值不唯一,且没有按照表键自动进行排序,支持通过索引访问和键访问两种方式.填充标准表时可以插入到指定位置或现在有行之后,程序对内表的寻址操作可以通过关键字或索引进行.在对表进行插入删除等操作时,各数据行在内存中的物理位置不变,系统仅重新排列各数据行的索引值.当经常用索引访问表的时候就选择标准表.经常使用二分法方式读取内表,效率高