*&---------------------------------------------------------------------* *& Report /EUTIN/DEMO_VIRTUAL_SORT *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* REPORT /eutin/demo_virtual_sort. PARAMETERS: loops TYPE int4 DEFAULT 10 OBLIGATORY. START-OF-SELECTION. PERFORM main. *&---------------------------------------------------------------------* *& Form MAIN *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* FORM main. DATA: lt_t100_sorted_up TYPE STANDARD TABLE OF t100 WITH EMPTY KEY, lt_t100_sorted_down TYPE STANDARD TABLE OF t100 WITH EMPTY KEY, lv_time_before TYPE i, lv_time_after TYPE i, lv_time_runtime_fld TYPE i, lv_time_runtime_fld1 TYPE i, lv_time_runtime_ref TYPE i, lv_time_runtime_ref1 TYPE i, lv_time_runtime_dif TYPE p LENGTH 8 DECIMALS 6. SET RUN TIME CLOCK RESOLUTION HIGH. SELECT * FROM t100 WHERE sprsl = @sy-langu AND arbgb LIKE 'S%' INTO TABLE @DATA(lt_t100). DATA(lv_fld) = 'Error'. CLEAR lv_time_runtime_fld1. DO loops TIMES. CLEAR: lt_t100_sorted_down[], lt_t100_sorted_up[]. GET RUN TIME FIELD lv_time_before. lt_t100_sorted_down[] = lt_t100[]. SORT lt_t100_sorted_down DESCENDING BY arbgb msgnr sprsl. lt_t100_sorted_up[] = lt_t100[]. SORT lt_t100_sorted_up ASCENDING BY arbgb msgnr sprsl. GET RUN TIME FIELD lv_time_after. DATA(lv_time_runtime_tmp) = lv_time_after - lv_time_before. IF lv_time_runtime_fld1 IS INITIAL. lv_time_runtime_fld1 = lv_time_runtime_tmp. ENDIF. lv_time_runtime_fld += lv_time_runtime_tmp. IF loops EQ 1. cl_demo_output=>write( lt_t100_sorted_up ). cl_demo_output=>write( lt_t100_sorted_down ). ENDIF. CLEAR: lt_t100_sorted_down[], lt_t100_sorted_up[]. ENDDO. DATA(lv_ref) = 'Error'. CLEAR lv_time_runtime_ref1. DO loops TIMES. CLEAR: lt_t100_sorted_down[], lt_t100_sorted_up[]. GET RUN TIME FIELD lv_time_before. lt_t100_sorted_up = cl_abap_itab_utilities=>virtual_sort( im_virtual_source = VALUE #( ( source = REF #( lt_t100 ) components = VALUE #( ( name = 'arbgb' ) ( name = 'msgnr' ) ( name = 'sprsl' ) ) ) ) ). lt_t100_sorted_down = cl_abap_itab_utilities=>virtual_sort( im_virtual_source = VALUE #( ( source = REF #( lt_t100 ) components = VALUE #( ( name = 'arbgb' descending = abap_true ) ( name = 'msgnr' descending = abap_true ) ( name = 'sprsl' descending = abap_true ) ) ) ) ). GET RUN TIME FIELD lv_time_after. lv_time_runtime_tmp = lv_time_after - lv_time_before. IF lv_time_runtime_ref1 IS INITIAL. lv_time_runtime_ref1 = lv_time_runtime_tmp. ENDIF. lv_time_runtime_ref += lv_time_runtime_tmp. IF loops EQ 1. cl_demo_output=>write( lt_t100_sorted_up ). cl_demo_output=>write( lt_t100_sorted_down ). ENDIF. CLEAR: lt_t100_sorted_down[], lt_t100_sorted_up[]. ENDDO. IF loops EQ 1. cl_demo_output=>display( ). ENDIF. lv_time_runtime_dif = lv_time_runtime_fld / lv_time_runtime_ref. DATA(lv_factor) = |times CL_ABAP_ITAB_UTILITIES=>VIRTUAL_SORT is faster than SORT!|. IF lv_time_runtime_fld LT lv_time_runtime_ref. lv_time_runtime_dif = lv_time_runtime_ref / lv_time_runtime_fld. lv_factor = |times SORT is faster than CL_ABAP_ITAB_UTILITIES=>VIRTUAL_SORT!|. ENDIF. WRITE: / '1. SORT ... ASCENDING/DESCENDING total: runtime in ms :', lv_time_runtime_fld LEFT-JUSTIFIED, / ' first loop: runtime in ms:', lv_time_runtime_fld1 LEFT-JUSTIFIED, / '2. CL_ABAP_ITAB_UTILITIES=>VIRTUAL_SORT( ) total runtime in ms :', lv_time_runtime_ref LEFT-JUSTIFIED, / ' first loop: runtime in ms:', lv_time_runtime_ref1 LEFT-JUSTIFIED. SKIP 1. WRITE: / |Factor { lv_time_runtime_dif } { lv_factor }|. ENDFORM. *--- The End!