二维码

[性能] ABAP中FM / Method复制内表数据对性能的影响

Twilight发表于 2016-10-25 14:36Twilight 最后回复于 2016-10-25 14:36 [复制链接] 3496 0

有时我们在主程序中会传递内表数据到FM / Method中,进行数据的处理,然后再将处理结果返回,这种场景中就涉及到内表的复制,如果大量多次调用FM / Method,就会对性能造成极大的影响,下面我们看一个测试案例。

一、主程序
  1. DATA: lt_edidd TYPE STANDARD TABLE OF edid4.
  2. DATA: lwa_edidd LIKE LINE OF lt_edidd.

  3. DATA: lv_sta_time TYPE timestampl,
  4.       lv_end_time TYPE timestampl,
  5.       lv_diff_w   TYPE p DECIMALS 5,
  6.       lv_diff_f   LIKE lv_diff_w,
  7.       lv_save     LIKE lv_diff_w.

  8. DATA: l_times TYPE i.

  9. START-OF-SELECTION.

  10.   l_times = 10000.

  11. * Table copy with []
  12.   GET TIME STAMP FIELD lv_sta_time.
  13.   DO l_times TIMES.
  14.     lwa_edidd-sdata = '1'.
  15.     APPEND lwa_edidd TO lt_edidd.

  16.     CALL FUNCTION 'ZTEST_NP_DATA_SET'
  17.       EXPORTING
  18.         it_edidd = lt_edidd.

  19.     CALL FUNCTION 'ZTEST_NP_DATA_GET'
  20.       IMPORTING
  21.         et_edidd = lt_edidd.
  22.   ENDDO.
  23.   GET TIME STAMP FIELD lv_end_time.
  24.   lv_diff_w = lv_end_time - lv_sta_time.
  25.   WRITE: /(30) 'Itab Copy', lv_diff_w.

  26. * table passed with reference
  27.   CLEAR lt_edidd.
  28.   DATA: lo_data TYPE REF TO data.
  29.   GET TIME STAMP FIELD lv_sta_time.
  30.   DO l_times TIMES.
  31.     lwa_edidd-sdata = '1'.
  32.     APPEND lwa_edidd TO lt_edidd.

  33.     GET REFERENCE OF lt_edidd INTO lo_data.

  34.     CALL FUNCTION 'ZTEST_NP_DATA_SET_1'
  35.       EXPORTING
  36.         io_edidd = lo_data.

  37.     CALL FUNCTION 'ZTEST_NP_DATA_GET_1'
  38.       IMPORTING
  39.         eo_edidd = lo_data.

  40.   ENDDO.
  41.   GET TIME STAMP FIELD lv_end_time.
  42.   lv_diff_f = lv_end_time - lv_sta_time.
  43.   WRITE: /(30) 'Itab Copy with Reference', lv_diff_f.
复制代码


二、新建一个函数组,再新建如下4个FM
函数组全局数据
  1. DATA:t_edidd TYPE tab_edidd.
  2. DATA:o_edidd TYPE REF TO data.
复制代码

1、ZTEST_NP_DATA_SET
  1. FUNCTION ztest_np_data_set.
  2. *"----------------------------------------------------------------------
  3. *"*"本地接口
  4. *"  IMPORTING
  5. *"     REFERENCE(IT_EDIDD) TYPE  TAB_EDIDD
  6. *"----------------------------------------------------------------------

  7.   t_edidd[] = it_edidd[].

  8.   DATA: lwa_edidd LIKE LINE OF t_edidd.
  9.   IF lines( t_edidd ) = 500.
  10.     APPEND lwa_edidd TO t_edidd.
  11.   ENDIF.

  12. ENDFUNCTION.
复制代码

2、ZTEST_NP_DATA_GET
  1. FUNCTION ZTEST_NP_DATA_GET.
  2. *"----------------------------------------------------------------------
  3. *"*"本地接口:
  4. *"  EXPORTING
  5. *"     REFERENCE(ET_EDIDD) TYPE  TAB_EDIDD
  6. *"----------------------------------------------------------------------

  7. et_edidd = t_edidd.

  8. ENDFUNCTION.
复制代码

3、ZTEST_NP_DATA_SET_1
  1. FUNCTION ztest_np_data_set_1.
  2. *"----------------------------------------------------------------------
  3. *"*"本地接口:
  4. *"  IMPORTING
  5. *"     REFERENCE(IO_EDIDD) TYPE REF TO  DATA
  6. *"----------------------------------------------------------------------

  7.   o_edidd = io_edidd.

  8.   FIELD-SYMBOLS: <lt_edidd> TYPE tab_edidd.

  9.   ASSIGN o_edidd->* TO <lt_edidd>.
  10.   DATA: lwa_edidd LIKE LINE OF <lt_edidd>.

  11.   IF lines( <lt_edidd> ) = 500.
  12.     APPEND lwa_edidd TO <lt_edidd>.
  13.   ENDIF.

  14. ENDFUNCTION.
复制代码

4、ZTEST_NP_DATA_GET_1
  1. FUNCTION ztest_np_data_get_1.
  2. *"----------------------------------------------------------------------
  3. *"*"本地接口:
  4. *"  EXPORTING
  5. *"     REFERENCE(EO_EDIDD) TYPE REF TO  DATA
  6. *"----------------------------------------------------------------------

  7.   eo_edidd = o_edidd.

  8. ENDFUNCTION.
复制代码

三、测试结果
ITAB copy.jpg
测试结果明显,除了使用TYPE REF TO提高性能外,我们还可以通过tables是一次传递多条数据,避免这种FM / Method的多次调用,因数据多次复制而浪费的性能。
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表