Skip to content

Instantly share code, notes, and snippets.

@alezhu
Created August 12, 2022 13:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alezhu/ec4e10cf95feef38960b7892385303cc to your computer and use it in GitHub Desktop.
Save alezhu/ec4e10cf95feef38960b7892385303cc to your computer and use it in GitHub Desktop.
Test speed of geting unique values from internal table
*&---------------------------------------------------------------------*
*& Report ZTEST_extract_uniq
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztest_extract_uniq.
TYPES:
BEGIN OF ts_result,
tag TYPE char30,
start TYPE i,
end TYPE i,
diff TYPE i,
count TYPE i,
END OF ts_result,
tt_result TYPE STANDARD TABLE OF ts_result WITH EMPTY KEY.
TYPES:
BEGIN OF ts_data,
ebeln TYPE ebeln,
ebelp TYPE ebelp,
matnr TYPE matnr,
END OF ts_data.
PARAMETERS p_repeat TYPE i DEFAULT 100.
PARAMETERS p_size TYPE i DEFAULT 10000.
START-OF-SELECTION.
PERFORM main.
FORM main.
DATA lt_result TYPE tt_result.
DATA ls_data TYPE ts_data.
DATA lt_data TYPE STANDARD TABLE OF ts_data WITH EMPTY KEY.
DATA:
BEGIN OF ls_matnr,
matnr TYPE matnr,
END OF ls_matnr,
lt_matnr LIKE HASHED TABLE OF ls_matnr WITH UNIQUE KEY matnr.
DO p_size TIMES.
ls_data-ebeln = sy-index.
ls_data-ebelp = sy-index.
ls_data-matnr = sy-index MOD 10.
APPEND ls_data TO lt_data.
ENDDO.
DO.
CASE sy-index.
WHEN 1.
APPEND VALUE #(
tag = 'COLLECT'
) TO lt_result ASSIGNING FIELD-SYMBOL(<s_result>).
WHEN 2.
APPEND VALUE #(
tag = 'INSERT'
) TO lt_result ASSIGNING <s_result>.
WHEN 3.
APPEND VALUE #(
tag = 'FOR GROUP'
) TO lt_result ASSIGNING <s_result>.
WHEN 4.
APPEND VALUE #(
tag = 'CORRESPONDING DISCARDING DUPLICATES'
) TO lt_result ASSIGNING <s_result>.
WHEN 5.
APPEND VALUE #(
tag = 'SELECT DISTINCT'
) TO lt_result ASSIGNING <s_result>.
WHEN 6.
APPEND VALUE #(
tag = 'SELECT+SORT+DELETE'
) TO lt_result ASSIGNING <s_result>.
WHEN 7.
APPEND VALUE #(
tag = 'COPY+SORT+DELETE+CORRESPONDING'
) TO lt_result ASSIGNING <s_result>.
WHEN OTHERS.
EXIT.
ENDCASE.
GET RUN TIME FIELD <s_result>-start.
CASE sy-index.
WHEN 1.
DO p_repeat TIMES.
CLEAR lt_matnr.
LOOP AT lt_data ASSIGNING FIELD-SYMBOL(<s_data>).
ls_matnr-matnr = <s_data>-matnr.
COLLECT ls_matnr INTO lt_matnr.
ENDLOOP.
ENDDO.
WHEN 2.
DO p_repeat TIMES.
CLEAR lt_matnr.
LOOP AT lt_data ASSIGNING <s_data>.
INSERT VALUE #( matnr = <s_data>-matnr ) INTO TABLE lt_matnr.
ENDLOOP.
ENDDO.
WHEN 3.
DO p_repeat TIMES.
CLEAR lt_matnr.
lt_matnr = VALUE #(
FOR GROUPS fg_matnr OF <fs_data> IN lt_data
GROUP BY <fs_data>-matnr WITHOUT MEMBERS
( matnr = fg_matnr )
).
ENDDO.
WHEN 4.
DO p_repeat TIMES.
CLEAR lt_matnr.
lt_matnr = CORRESPONDING #( lt_data DISCARDING DUPLICATES ).
ENDDO.
WHEN 5.
DO p_repeat TIMES.
CLEAR lt_matnr.
##ITAB_DB_SELECT
SELECT DISTINCT matnr FROM @lt_data AS input INTO TABLE @lt_matnr.
ENDDO.
WHEN 6.
DO p_repeat TIMES.
CLEAR lt_matnr.
SELECT matnr FROM @lt_data AS input INTO TABLE @DATA(lt_temp).
SORT lt_temp BY matnr.
DELETE ADJACENT DUPLICATES FROM lt_temp COMPARING matnr.
lt_matnr = lt_temp.
ENDDO.
WHEN 7.
DO p_repeat TIMES.
CLEAR lt_matnr.
DATA(lt_data2) = lt_data.
SORT lt_data2 BY matnr.
DELETE ADJACENT DUPLICATES FROM lt_data2 COMPARING matnr.
lt_matnr = CORRESPONDING #( lt_data2 ).
ENDDO.
WHEN OTHERS.
ENDCASE.
GET RUN TIME FIELD <s_result>-end.
<s_result>-diff = <s_result>-end - <s_result>-start.
<s_result>-count = lines( lt_matnr ).
ENDDO.
SORT lt_result BY diff.
LOOP AT lt_result ASSIGNING <s_result>.
WRITE: <s_result>-tag, <s_result>-diff, <s_result>-start, <s_result>-end, <s_result>-count.
NEW-LINE.
ENDLOOP.
ENDFORM.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment